MySQL零基础从入门到精通(约束篇)
MySQL约束
概念
约束英文:constraint
约束实际上就是表中数据的限制条件
作用
表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类
- 主键约束(primary key) PK
- 自增长约束(auto_increment)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key) FK
主键约束
概念
- MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
- 主键约束相当于唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。(非空且唯一)
- 每个表最多只允许一个主键
- 主键约束的关键字是:primary key
- 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
操作
- 添加单列主键
- 添加多列联合主键
- 删除主键
添加单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键。
方式一:在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
在定义字段的同时指定主键
语法:
create table 表名(
...
<字段名> <数据类型> primary key
...
)
示例:
CREATE TABLE IF NOT EXISTS emp1(
eid INT PRIMARY KEY, -- 指定eid列为单列主键
`name` VARCHAR(20),
deptId INT,
salary DOUBLE
);
在Navicat中通过设计表可以查看:
方式二:在定义字段之后再指定主键。
语法:
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
示例:
CREATE TABLE IF NOT EXISTS emp2(
eid INT,
`name` VARCHAR(20),
deptId INT ,
salary DOUBLE,
CONSTRAINT pk1 PRIMARY KEY (eid) -- CONSTRAINT pk1 可省
);
添加多列主键(联合主键)
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
注意:
1、当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
2、一张表只能有一个主键,联合主键也是一个主键
3、联合主键表示,多个列联合起来作为主键,这些列任何一列都不能为空,联合起来不能重复。
语法:
create table 表名(
...
primary key (字段1,字段2,…,字段n)
);
示例:
-- 联合主键就是这个主键是由一张表中多个字段组合而成
-- PRIMARY KEY(字段名1,字段名2,字段名3,...,字段n)
CREATE TABLE IF NOT EXISTS emp3(
`name` VARCHAR(20),
deptId INT,
salary DOUBLE,
CONSTRAINT pk2 PRIMARY KEY (name,deptId) -- 将name列和deptId列一起,创建联合主键
);
在Navicat中通过设计表可以查看:
通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
语法:
create table 表名(
...
);
alter table <表名> add primary key(字段列表);
示例:
-- 创建表
CREATE TABLE IF NOT EXISTS emp4(
eid INT,
`name` VARCHAR(20),
deptId INT,
salary DOUBLE
);
-- 修改表结构,添加单列主键
ALTER TABLE emp4 add PRIMARY KEY(eid);
-- 创建表
CREATE TABLE IF NOT EXISTS emp5(
eid INT,
`name` VARCHAR(20),
deptId INT,
salary DOUBLE
);
-- 修改表结构,添加联合主键
ALTER TABLE emp5 add PRIMARY KEY (name,deptId);
删除主键约束
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。
删除主键约束时,并不需要指定要删除哪个主键也不需要指定单列主键还是联合主键,因为每张表只有一个主键。
语法:
alter table 数据表名 drop primary key;
示例:
-- 删除主键
-- 删除单列主键
ALTER TABLE emp1 DROP PRIMARY KEY;
-- 删除多例主键
ALTER TABLE emp5 DROP PRIMARY KEY;
自增长约束(auto_increment)
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长
添加自增长约束
语法:
字段名 数据类型 auto_increment;
示例:
CREATE TABLE IF NOT EXISTS t_user1(
id INT PRIMARY KEY auto_increment, -- 添加主键自增长约束
`name` VARCHAR(20)
);
特点
- 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。 - auto_increment约束的字段必须具备 NOT NULL 属性。
- auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等。
- auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。
例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加。
查看auto_increment约束的默认起始值。
-- 添加数据,查看auto_increment约束默认的起始值
INSERT INTO t_user1 VALUES(NULL,'一');
INSERT INTO t_user1 VALUES(NULL,'二');
发现,auto_increment约束的起始值默认值1.
可以手动指定auto_increment约束的起始值。
方式一:创建表时指定
-- 自增长约束。创建表时指定起始值
CREATE TABLE IF NOT EXISTS t_user2(
id INT PRIMARY KEY auto_increment,
`name` VARCHAR(20)
)auto_increment=100; -- 手动指定auto_increment约束的起始值。
-- 添加数据,查看auto_increment约束的起始值
INSERT INTO t_user2 VALUES(NULL,'一');
INSERT INTO t_user2 VALUES(NULL,'二');
查看指定起始值表的起始值。
方式二:创建表后指定
CREATE TABLE IF NOT EXISTS t_user3(
id INT PRIMARY KEY auto_increment,
`name` VARCHAR(20)
);
SHOW CREATE TABLE t_user3;
-- 建表后指定自增长约束默认的起始值
ALTER TABLE t_user3 auto_increment = 200;
-- 添加数据,查看auto_increment的默认起始值
INSERT INTO t_user3 VALUES(NULL,'一');
INSERT INTO t_user3 VALUES(NULL,'二');
查看指定起始值表的起始值。
delete和truncate在删除后自增列的变化
- delete数据之后自动增长从断点开始
- truncate数据之后自动增长从默认起始值开始
情形一:未手动指定auto_increment约束起始值的表
delete未手动指定auto_increment约束起始值的整张表数据后,再插入数据查看自增长约束的起始值。
-- delete和truncate在删除后自增列的变化
-- 删除整张表的数据
DELETE FROM t_user1;
-- 删除整张表的数据后(未手动指定起始值),再插入数据,查看现在的自增长约束的起始值
INSERT INTO t_user1 VALUES(NULL,'一');
INSERT INTO t_user1 VALUES(NULL,'二');
结果:delete后,再次插入数据是继续上次的值。
truncate未手动指定auto_increment约束起始值的整张表数据后,再插入数据查看自增长约束的起始值。
-- delete和truncate在删除后自增列的变化
-- truncate整张表后(未手动指定起始值),再插入数据,查看现在的自增长约束的起始值
TRUNCATE t_user1;
INSERT INTO t_user1 VALUES(NULL,'一');
INSERT INTO t_user1 VALUES(NULL,'二');
结果:truncate后从默认的起始值1开始
情形二:手动指定auto_increment约束起始值的表
delete手动指定auto_increment约束起始值的整张表数据后,再插入数据查看自增长约束的起始值。
-- 手动指定auto_increment约束起始值的表
-- delete和truncate在删除后自增列的变化
-- 删除整张表的数据(手动指定起始值)
DELETE FROM t_user2;
-- 删除整张表的数据后,再插入数据,查看现在的自增长约束的起始值
INSERT INTO t_user2 VALUES(NULL,'一');
INSERT INTO t_user2 VALUES(NULL,'二');
结果:delete后,再次插入数据是继续上次的值。
truncate手动指定auto_increment约束起始值的整张表数据后,再插入数据查看自增长约束的起始值。
-- 手动指定auto_increment约束起始值的表
-- delete和truncate在删除后自增列的变化
-- truncate整张表后(手动指定起始值),再插入数据,查看现在的自增长约束的起始值
TRUNCATE t_user2;
INSERT INTO t_user2 VALUES(NULL,'一');
INSERT INTO t_user2 VALUES(NULL,'二');
结果:truncate后从默认的起始值开始,而非之前手动指定的起始值开始。
非空约束(NOT NULL)
概念
MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
添加非空约束
语法:
-- 方式一,建表时
<字段名> <数据类型> NOT NULL;
-- 方式二,建表后
ALTER TABLE 表名 MODIFY 字段 类型 NOT NULL;
示例:
方式一:
-- 非空约束
-- 建表时,添加非空约束
CREATE TABLE IF NOT EXISTS t_user6(
id INT,
`name` VARCHAR(20) NOT NULL, -- 非空约束
`address` VARCHAR(20) NOT NULL -- 非空约束
);
通过Navicat设计表查看:
方式二:
-- 创建数据表不添加非空约束
CREATE TABLE IF NOT EXISTS t_user7(
id INT,
`name` VARCHAR(20),
`address` VARCHAR(20)
);
-- 建表后添加非空约束
ALTER TABLE t_user7 MODIFY `name` VARCHAR(20) NOT NULL;
ALTER TABLE t_user7 MODIFY `address` VARCHAR(20) NOT NULL;
通过Navicat设计表查看:
删除非空约束
语法:
ALTER TABLE 表名 MODIFY 字段名 数据类型;
示例:
-- 删除非空约束
ALTER TABLE t_user7 MODIFY `name` VARCHAR(20);
ALTER TABLE t_user7 MODIFY `address` VARCHAR(20);
通过Navicat设计表查看:
注意:
如果修改时将数据类型也修改了,结果会跟着修改后的一起改变。
唯一约束(UNIQUE)
概念
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。
添加唯一约束
语法:
-- 方式一:建表时添加唯一约束
<字段名> <数据类型> UNIQUE;
-- 方式二:建表后添加唯一约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列);
示例:
-- 唯一约束
-- 添加方式一:创建表时指定
CREATE TABLE IF NOT EXISTS t_user9(
id INT,
`name` VARCHAR(20),
`phone_number` VARCHAR(20) UNIQUE -- 指定唯一约束
);
-- 添加方式二:建表后指定
CREATE TABLE IF NOT EXISTS t_user8(
id INT,
`name` VARCHAR(20),
`phone_number` VARCHAR(20)
);
-- 添加唯一约束
ALTER TABLE t_user8 ADD CONSTRAINT unique_pn UNIQUE (phone_number);
注意:
指定了唯一约束列插入的数据允许为NULL。NULL与任何数值都不相同,NULL和他本身也不相同。
示例:
INSERT INTO t_user8 VALUES (1001,'一',138);
INSERT INTO t_user8 VALUES (1002,'二',NULL);
INSERT INTO t_user8 VALUES (1003,'三',NULL);
查看插入的数据:
删除唯一约束
语法:
ALTER TABLE 表名 DROP INDEX <唯一约束名>;
示例:
-- 删除唯一约束(建表后单独添加的唯一约束,有约束名)
ALTER TABLE t_user8 DROP INDEX unique_pn;
图示:
如果是建表时指定了唯一约束,那么唯一约束名为指定了唯一约束的列名。
示例:
-- 删除唯一约束,建表时指定的唯一约束,没有约束名
ALTER TABLE t_user9 DROP INDEX phone_number; -- 添加了唯一约束的列名即作为约束名
默认约束(DEFAULT)
概念
MySQL 默认值约束用来指定某列的默认值。
添加默认约束
语法:
-- 建表时指定默认约束
<字段名> <数据类型> default <默认值>;
-- 方式二:建表后指定默认约束
ALTER TABLE 表名 MODIFY 列名 类型 DEFAULT 默认值;
示例:
-- 默认约束
-- 添加默认约束,方式一:建表时指定
CREATE TABLE IF NOT EXISTS t_user10(
id INT,
`name` VARCHAR(20),
`address` VARCHAR(20) DEFAULT '北京' -- 指定默认约束,指定的数值必须与类型一致
);
-- 添加默认约束,方式二:建表后单独指定
CREATE TABLE IF NOT EXISTS t_user11(
id INT,
`name` VARCHAR(20),
`address`VARCHAR(20)
);
-- 建表后单独指定唯一约束
ALTER TABLE t_user11 MODIFY address VARCHAR(20) DEFAULT '深圳';
注意:
如果插入数据时,指定默认约束的那列值为NULL,那该列的值会为NULL,而非默认值。
删除默认约束
语法:
ALTER TABLE 表名 MODIFY <列名> <数据类型> DEFAULT NULL;
示例:
-- 删除唯一约束
ALTER TABLE t_user11 MODIFY address VARCHAR(20) DEFAULT NULL;
零填充约束(ZEROFILL)
概念
-
1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
-
2、zerofill默认为int(10)
-
3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256。
添加零填充约束
语法:
<列名> <数据类型> ZEROFILL;
示例:
-- 零填充约束
CREATE TABLE IF NOT EXISTS t_user12(
id INT ZEROFILL, -- 添加零填充约束
`name` VARCHAR(20)
);
添加零填充,图示:
删除零填充约束
语法:
ALTER TABLE 表名 MODIFY <列名> <数据类型>;
示例:
-- 删除零填充约束
ALTER TABLE t_user12 MODIFY id INT;
删除零填充,图示:
注意:
零填充约束,默认int类型长度为10,不足位补0,但是,底层并未将这些数据记录,只是展示效果而已。
总结
约束篇结束!!!