SQL中的约束
约束(CONSTRAINT)
对表中字段的限制
-
非空约束:
NOT NULL
只能声明在每个字段的后面CREATE TABLE test( id INT NOT NULL, last_name VARCHAR(15), phone VARCHAR(20) NOT NULL );
-
唯一性约束:
UNIQUE
说明:
① 可以声明在字段的后面,也可以声明在表的后面
② 如果不指定约束名字,默认和字段名相同
③ 设置UNIQUE
的字段,可以有多条记录是NULL
④ 表级约束,可以将多个字段组合成唯一性约束在创建表时,设置唯一性约束
CREATE TABLE test( id INT UNIQUE, # 列级的唯一性约束 last_name VARCHAR(15), email VARCHAR(25), salary DECIMAL(10,2), CONSTRAINT uk_test_email UNIQUE(email) # 表级的唯一性约束,指明约束名称 # UNIQUE(email) #表级的唯一性约束,不指定约束名,简写形式 # CONSTRAINT uk_test_id_email UNIQUE(id, email) # 表级唯一性约束 );
修改唯一性约束
# 方式一 ALTER TABLE test ADD CONSTRAINT uk_test_salary UNIQUE(salary); # ADD UNIQUE(salary) #不指定约束名,简写形式 #方式二 ALTER TABLE test MODIFY salary DECIMAL(10,2) UNIQUE;
删除唯一性约束
说明
① 添加唯一性约束的列上,也会自动创建唯一索引
② 删除唯一性约束只能通过删除唯一索引的方式
③ 删除时需要指定唯一索引名(与唯一性约束名相同)
④ 如果创建唯一约束时未指定约束名,如果是单列,默认和字段名一致,如果是多列,默认是()中第一个字段名相同ALTER TABLE test DROP INDEX 唯一索引名;
查看表中的唯一索引
SHOW INDEX FROM 表名;
-
主键约束:
PRIMARY KEY
说明:
① 一个表中只能有一个主键约束,要么单列,要么复合列
② 主键约束的列不能为NULL,且不能重复
③ 主键名为PRIMARY
,不可修改
④ 用于唯一标识表中的一条记录CREATE TABLE test( id INT PRIMARY KEY, # 列级约束 last_name VARCHAR(15), salary DECIMAL(10,2) # CONSTRAINT PRIMARY KEY(id) #表级约束 # PRIMARY KEY(id, last_name) #复合主键约束 ); # 删除主键约束 ALTER TABLE test DROP PRIMARY KEY;
-
自增列:
AUTO_INCREMENT
说明
① 某个字段值的自增
② 一个表中最多有一个自增长列
③ 自增长列必须是键列(PRIMARY KEY
、UNIQUE
)
④ 自增列必须是整数类型
⑤ 当向自增列添加0或NULL时,实际上会设置成自增值CREATE TABLE test( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) ); # 删除自增列 ALTER TABLE test MODIFY id INT;
-
外键约束:
FOREIGN KEY
说明
① 限定某个表的某个字段的引用完整性
② 从表的外键列,必须是主表的主键或唯一约束
③ 在创建外键约束时,如果不手动命名,则会自动产生一个外键名# 创建主表 CREATE TABLE departments( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(15) ); # 创建从表 CREATE TABLE employees( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), department_id INT, CONSTRAINT fk_emp_dept_id FOREIGN KEY (department_id) REFERENCES departments(id) );
约束等级
①CASCADE
:在父表上update/delete记录时,同步update/delete子表上匹配的记录
②SET NULL
:在父表上update/delete记录时,将子表上匹配的记录设置为NULL
(子表外键不能为NOT NULL)
③NO ACTION
:如果子表中引用了父表中的内容,则不允许删除父表中被引用的记录
④RESTRICT
:同NO ACTION
⑤SET DEFAULT
:父表有变更时,子表对应字段会设置成默认值# 当主表修改主键时,从表所有引用的部分也会响应修改 # 当主表删除某条数据时,从表所有引用的部分会设置成NULL CREATE TABLE employees( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), department_id INT, FOREIGN KEY (department_id) REFERENCES departments(id) ON UPDATE CASCADE ON DELETE SET NULL ); # 删除外键约束 ALTER TABLE employees DROP FOREIGN KEY 外键约束名;
-
检查约束:
CHECK
说明
① 检查某个字段的值是否符合某些要求,一般指值的范围CREATE TABLE employees( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) CHECK(salary > 3000) );
-
默认值约束:
DEFAULT
CREATE TABLE test( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) DEFAULT 2000 );