1. 程式人生 > >關系與外鍵約束

關系與外鍵約束

ons null 範式 con ble 邏輯 alt 插入 成績

關系

  • 創建成績表scores,結構如下

    id
    學生
    科目
    成績

  • 思考:學生列應該存什麽信息呢?
  • 答:學生列的數據不是在這裏新建的,而應該從學生表引用過來,關系也是一條數據;根據範式要求應該存儲學生的編號,而不是學生的姓名等其它信息
  • 同理,科目表也是關系列,引用科目表中的數據
  • 創建表的語句如下
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
一對一(假設獨身子女)
學生表:(id,學生名字,科目,成績,motherid,fatherid)
母親表:(id,母親名字)
父親表:(id,父親名字)
一對多
學生表:(id,學生名字,科目,成績,motherid,fatherid)
母親表:(id,母親名字)
父親表:(id,父親名字)

多對多
學生表:(id,學生名字,科目,成績,motherid,fatherid,teacherid)
老師表:(id,老師名字)

外鍵

  • 思考:怎麽保證關系列數據的有效性呢?任何整數都可以嗎?
  • 答:必須是學生表中id列存在的數據,可以通過外鍵約束進行數據的有效性驗證
  • 為stuid添加外鍵約束
alter table scores add constraint stu_sco foreign key(stuid) references students(id);
  • 此時插入或者修改數據時,如果stuid的值在students表中不存在則會報錯
  • 在創建表時可以直接創建約束
create table scores(
id int primary key auto_increment,
stuid 
int, subid int, score decimal(5,2), foreign key(stuid) references students(id), foreign key(subid) references subjects(id) );

外鍵的級聯操作

  • 在刪除students表的數據時,如果這個id值在scores中已經存在,則會拋異常
  • 推薦使用邏輯刪除,還可以解決這個問題
  • 可以創建表時指定級聯操作,也可以在創建表後再修改外鍵的級聯操作
  • 語法
alter table scores add constraint stu_sco foreign key
(stuid) references students(id) on delete cascade;
  • 級聯操作的類型包括:

    restrict(限制):默認值,拋異常
    cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
    set null:將外鍵設置為空
    no action:什麽都不做

關系與外鍵約束