参照完整性的本质
- 通过添加一张父表的形式,给当前操作的表(子表)添加一个约束(字典)。
即:要求子表的某字段(外键),必须在父表的对应字段范围内取值(即写的字,一定要是字典里有的)。
- 约定了父表进行删除(on delete)或修改(on update)的时候,子表如何保持约束有效(严格/级联/不动作/设空/设默认值)。
即:改变字典的内容时,文章里对应的字将如何变化。
通常设置 [严格(默认)/级联/设空/设默认值],对应关键字(无/cascade/set null/set default),含义为(禁止修改字典/文章里的字跟着改/文章里的字设为空/文章里的字设为默认值)
设置参照完整性后,对两表的一切操作,都应满足上面第一点的描述,且按照第二点的规则工作。
定义参照完整性
思想:
- 子表中选出一列做外键(默认会被添加普通索引),跟父表的索引(主键或唯一)关联。
- 可以起个名字,最好起个名字。(默认的名字不直观)
- 可以设置父表的删改规则,不指定默认“严格”。
语法:
- 完整写法举例
CONSTRAINT xh1 FOREIGN KEY (xh) REFERENCES t1(xh) ON DELETE cascade ON UPDATE cascade
含义:把当前表的xh字段和t1表的xh字段关联,起个名字叫xh1,删除规则是级联,更新规则是级联。
- 最简写法举例
FOREIGN KEY (xh) REFERENCES t1(xh)
含义:把当前表的xh字段和t1表的xh字段关联,名字是mysql乱起的,删除规则是严格,更新规则是严格。
使用:
可以把上面参照完整性的内容,当作字段,在创建表(create table)或修改表(alter table)的命令里使用。
如
CREATE TABLE t2 (xh char(1) DEFAULT NULL,km varchar(2) DEFAULT NULL,cj int DEFAULT NULL, KEY xh (xh),CONSTRAINT xh FOREIGN KEY (xh) REFERENCES t1 (xh))
或
alter table t2 add CONSTRAINT xh FOREIGN KEY (xh) REFERENCES t1(xh) ON DELETE cascade ON UPDATE cascade;
删除的时候必须用到名字
alter table t2 drop CONSTRAINT xh;
小技巧:对于系统的自动命名,可以通过显示建表命令来查看名称。
如
show create table t1;
示例:
t1为基本情况表,t2为成绩表
内容:
借助t1的xh字段,为t2的xh字段添加参照完整性规则:
alter table t2 add FOREIGN KEY (xh) REFERENCES t1(xh);
这是“默认命名”的“严格”规则。运行结果:
t2的xh字段在此时也被自动添加了普通索引:
分别尝试修改t2的最后一条记录和t1的最后一条记录,把学号改为'4',可以看到修改被拒绝:
在提示中,也可以看到系统给出的默认约束名称:t2_ibfk_1。
把修改和删除规则改为级联。思想:删除,添加新的规则:
修改父表时,可以看到子表内容也被修改: