天天看點

三十四、外鍵限制

一、參照完整性

參照完整性要求關系中不允許引用不存在的實體。在 MySQL 中設定參照完整性的方式是使用 外鍵限制 。所謂外鍵就是用于在兩個表中的資料之間建立和加強連結的一列或多列的組合,可控制可在外鍵表中存儲的資料。例如,有學生表和分數表兩個表,表内容如下。

student 學生表:

stu_no name phone
2021001 張三 123456789
2021002 李四 987654321

score 分數表:

score_no gross_score
1 750
2 685

在分數表中有 stu_no 列存儲的是學生表中的學生編号,當我們把這個字段設定為分數表的外鍵字段後,插入一條不存在的學生的分數将會報錯。例如插入一條stu_no 編号為 2021003 的學生的分數,這時 MySQL 将會報錯。這是因為在學生表中不存在編号為 2021003 的學生,如果想插入成功則必須現在學生表中建立編号為 2021003 這個學生後再向分數表插入這個學生的分數。

二、外鍵限制

上一小節提到了外鍵限制,那麼什麼是外鍵限制呢?外鍵限制是用于保持主表(父表)和從表(子表)的資料一直。在 MySQL 中隻有 InnoDB 存儲引擎支援外鍵限制。外鍵限制的文法如下:

[CONSTRAINT [symbol]] FOREIGRN KEY [index_name] (col_name,...) REFERENCES tbl_name(col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
           
  1. RESTRICT:拒絕對父表的删除或更新操作;
  2. CASCADE:從父表删除或更新時自動删除或更新子表中比對的行;
  3. SET NULL:從父表删除或更新時自動設定子表對應的外鍵列為NULL;
  4. NO ACTION: 不采取任何動作;
  5. SET DEFAULT:使用預設限制
# 建立學生表
create table student(
    stu_no varchar(30) not null primary key,
    name varchar(30),
    phone varchar(30)
) engine=InnoDB
# 建立分數表,設定 stu_no 為外鍵
create table score(
    score_no int not null auto_increment primary key,
    stu_no varchar(30),
    gross_score int,
    foreign key(stu_no) references student(stu_no)
) engine=InnoDB
           

繼續閱讀