一:外键约束;
A表中列的值来自于另外一张表B的主键或唯一键的列称为 外键FK,将被引用值得表称为 主表或父表,将引用值得表称为从表或子表。 例如: emp 表中有 deptno 列,值来自于 de pt 表的 主键 deptno 。 dept 是主表, emp 是从表。
1;创建表时加外键约束;
CREATE TABLE `dept`( dept_no INT PRIMARY KEY, dept_name VARCHAR(20), ) CREATE TABLE `emp` ( `id` int NOT NULL, `name` varchar(20), `deptno` int, CONSTRAINT fk_dept_no FOREIGN KEY(deptno) REFERENCES dept(dept_no) );
dept 是主表, userinfo 是从表
创建外键时,会在引用表(从表)的字段上建立索引 这个字段上有则不创建
在 ‘从表’ 表中添加或修改时, dept_no 列的值必须是 dept 表中 deptno 字段中的 存在值或者 NULL
删除从表数据时可以直接删除
删除主表数据时,会先检查被删除数据在从表中有没有对此数据的关联(引用),如果 有不能直接删除。
2:外键约束的语法规则;
alter table 表名 add constraint 外键名 foreign key (dept_no) REFERENCES dept(dept_no);
foreign key 表示外键约束
add constraint 表示添加约束
on delete CASCADE / ON DELETE SET NULL级联删除 (更新主键时,外键也会随之更新)
on update CASCADE / ON UPDATE SET NULL级联更新 (删除主键时,外键也随之删除)
3:删除
ALTER TABLE tb_name DROP CONSTRAINT constraint_name; alter table 表名称 drop foreign key 设置外键时的名称;
二:检查约束
check 检查约束,在数据添加或修改时保证数据的有效性。符合表达式的才会正确执行。
1;创建表时加外键约束;
CREATE TABLE users ( ... , age INT CHECK (age >= 18) ); CREATE TABLE users ( ... , CONSTRAINT chk_xxx CHECK(expr) );
2:给表中加数据时添加;
ALTER TABLE emp2 MODIFY sal DOUBLE CHECK(sal >= 2000); ALTER TABLE tb_name ADD CONSTRAINT chk_xx check(id > 10)
3:删除约束
ALTER TABLE tb_name DROP CONSTRAINT tb_chk_num;