FOREIGN KEY 外键 (重点)
3. 约束方式:
...,
foreign key (设置的字段) references 主表(主键) on delete cascade on update cascade
);
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
...,
foreign key (设置的字段) references 主表(主键) on set null on set null
);
在父表上update/delete记录时,将子表上匹配记录的列设为null
3.3 禁止约束(restrict)
create table tableName (
id int not null,
...,
foreign key (设置的字段) references 主表(主键) on delete restrict on delete restrict
);
如果子表中有匹配的记录,则不允许对父表update/delete操作
1.过多使用外键,会导致表过多,程序耗时和耗资源
2.在数据很大时,不适合用。因为在执行insert/update/delete 时都会去扫描此记录是否合格,这很耗资源和时间。
注意:
除了InnoDB类型外其他类型的表都忽略了外键保持数据完整性的功能
1. 针对从表设置外键约束
2. 数据的完整性当我们在从表插入数据时,如果外键值在主表中不存在,就会报错。
3.1 级联约束(cascade)
create table tableName (
id int not null,...,
foreign key (设置的字段) references 主表(主键) on delete cascade on update cascade
);
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
3.2 置空约束 (set null)
create table tableName (
id int not null,...,
foreign key (设置的字段) references 主表(主键) on set null on set null
);
在父表上update/delete记录时,将子表上匹配记录的列设为null
3.3 禁止约束(restrict)
create table tableName (
id int not null,
...,
foreign key (设置的字段) references 主表(主键) on delete restrict on delete restrict
);
如果子表中有匹配的记录,则不允许对父表update/delete操作
优点:保证数据一致性,完整性
缺点:1.过多使用外键,会导致表过多,程序耗时和耗资源
2.在数据很大时,不适合用。因为在执行insert/update/delete 时都会去扫描此记录是否合格,这很耗资源和时间。
注意:
除了InnoDB类型外其他类型的表都忽略了外键保持数据完整性的功能