万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!

参照完整性的本质

  • 通过添加一张父表的形式,给当前操作的表(子表)添加一个约束(字典)。

即:要求子表的某字段(外键),必须在父表的对应字段范围内取值(即写的字,一定要是字典里有的)。

  • 约定了父表进行删除(on delete)或修改(on update)的时候,子表如何保持约束有效(严格/级联/不动作/设空/设默认值)。

即:改变字典的内容时,文章里对应的字将如何变化。

通常设置 [严格(默认)/级联/设空/设默认值],对应关键字(无/cascade/set null/set default),含义为(禁止修改字典/文章里的字跟着改/文章里的字设为空/文章里的字设为默认值)

设置参照完整性后,对两表的一切操作,都应满足上面第一点的描述,且按照第二点的规则工作。

ps:相对来说,最常用的还是严格和级联,mysql不支持设默认值。


 定义参照完整性

思想:

  1. 子表中选出一列做外键(默认会被添加普通索引),跟父表的索引(主键或唯一)关联。
  2. 可以起个名字,最好起个名字。(默认的名字不直观)
  3. 可以设置父表的删改规则,不指定默认“严格”。

语法:

  •  完整写法举例
    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。

把修改和删除规则改为级联。思想:删除,添加新的规则:

 

 修改父表时,可以看到子表内容也被修改:

 

posted on 2021-11-18 13:54  万金流  阅读(866)  评论(0)    收藏  举报