约束(CONSTRAINT)
对表中字段的限制
-
非空约束 :
NOT NULL只能声明在每个字段的后面
sqlCREATE TABLE test( id INT NOT NULL, last_name VARCHAR(15), phone VARCHAR(20) NOT NULL ); -
唯一性约束 :
UNIQUE说明:
① 可以声明在字段的后面,也可以声明在表的后面
② 如果不指定约束名字,默认和字段名相同
③ 设置
UNIQUE的字段,可以有多条记录是NULL④ 表级约束,可以将多个字段组合成唯一性约束
在创建表时,设置唯一性约束
sqlCREATE 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) # 表级唯一性约束 );修改唯一性约束
sql# 方式一 ALTER TABLE test ADD CONSTRAINT uk_test_salary UNIQUE(salary); # ADD UNIQUE(salary) #不指定约束名,简写形式 #方式二 ALTER TABLE test MODIFY salary DECIMAL(10,2) UNIQUE;删除唯一性约束
说明
① 添加唯一性约束的列上,也会自动创建唯一索引
② 删除唯一性约束只能通过删除唯一索引的方式
③ 删除时需要指定唯一索引名(与唯一性约束名相同)
④ 如果创建唯一约束时未指定约束名,如果是单列,默认和字段名一致,如果是多列,默认是()中第一个字段名相同
sqlALTER TABLE test DROP INDEX 唯一索引名;查看表中的唯一索引
sqlSHOW INDEX FROM 表名; -
主键约束 :
PRIMARY KEY说明:
① 一个表中只能有一个主键约束,要么单列,要么复合列
② 主键约束的列不能为NULL,且不能重复
③ 主键名为
PRIMARY,不可修改④ 用于唯一标识表中的一条记录
sqlCREATE 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时,实际上会设置成自增值
sqlCREATE TABLE test( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) ); # 删除自增列 ALTER TABLE test MODIFY id INT; -
外键约束 :
FOREIGN KEY说明
① 限定某个表的某个字段的引用完整性
② 从表的外键列,必须是主表的主键或唯一约束
③ 在创建外键约束时,如果不手动命名,则会自动产生一个外键名
sql# 创建主表 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:父表有变更时,子表对应字段会设置成默认值sql# 当主表修改主键时,从表所有引用的部分也会响应修改 # 当主表删除某条数据时,从表所有引用的部分会设置成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说明
① 检查某个字段的值是否符合某些要求,一般指值的范围
sqlCREATE TABLE employees( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) CHECK(salary > 3000) ); -
默认值约束 :
DEFAULTsqlCREATE TABLE test( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15), salary DECIMAL(10,2) DEFAULT 2000 );