万金流
初次使用博客园,目前感觉还不错。 不知不觉用了4年零4个月了,越来越喜欢博客园。

参照完整性的本质

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

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

  • 约定了父表进行删除(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  万金流  阅读(741)  评论(0编辑  收藏  举报