概念:
约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:
保存数据库中数据的正确,有效性和完整性。
分类:
注意事项:约束是作用在数据表中的字段上的,可以在创建表或修改表的时候添加约束。
案例一:根据要求,完成表结构的创建
外键约束
概念:
外键用来让两张表的数据之间建立连接,从而保持数据的一致性和完整性。
表示例:
添加外键的两种方式
在新增数据表时进行新增:
create table 表名(
字段名 数据类型,....
constaraint [外键名称] foreign key (外键字段名) references 主表(主表列名)
)
数据表已存在,添加字段外键:
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名)
注意:父表与子表如果已经提前存在,外键还没创建,那么在创建外建时,如果要创建外键的那个字段,子表该字段已存在的所有数据与父表该字段已存在的所有数据如果有差集,那么就会出现如下错误:
删除外键,测试外键的功能,数据完整性功能
案例一:
案例二:
删除外键语句
alter table 表名 drop foreign key 外键名称;
外键约束
删除/更新行为
注意:如果修改已存在的外键约束的策略,你需要先删除旧的外键约束,然后重新创建它,并在创建时指定具体你想要的行为。
指定行为的语句为:
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名) on delete restrict on update restrict
测试 NO ACTION
新增外键为NO ACTION 行为
alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete no action on update no action;
结果:
注意:
历史原因:RESTRICT
和NO ACTION
的不同关键字源于 SQL 标准,但 MySQL 实现中它们的行为相同。兼容性:MySQL 支持这两个关键字是为了与其他数据库系统的兼容性。
内部实现:在 MySQL 中,
RESTRICT
和NO ACTION
没有区别,都表示相同的行为。
当指定外键为 no action 时,数据库会显示RESTRICT,因为 no action 与 RESTRICT是相等的行为;且将no action 显示为 RESTRICT ,只不过是mysql的一种内部处理方式而已。
删除子表数据时:
删除父表数据时
由于父表不存在11这个id,所以修改失败了
新增外键为RESTRICT 行为
alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete RESTRICT on update RESTRICT;
修改:
删除:
新增外键为cascade行为
alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete cascade on update cascad
更新
删除
新增外键为set null行为
alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete set null on update set null
删除:
新增外键为set null行为
alter table emp add constraint fk_dept_id foreign key (dept_id) references dept(id) on delete set default on update set default