MySQL高級之關係

1、關係

建立成績表scores,結構以下ui

  • id
  • 學生
  • 科目
  • 成績

思考:學生列應該存什麼信息呢?spa

答:學生列的數據不是在這裏新建的,而應該從學生表引用過來,關係也是一條數據;根據範式要求應該存儲學生的編號,而不是學生的姓名等其它信息同理,科目表也是關係列,引用科目表中的數據rest

 

建立表的語句以下code

create table scores(
  id int primary key auto_increment,
  stuid int,
  subid int,
  score decimal(5,2)
);

2、外鍵

思考:怎麼保證關係列數據的有效性呢?任何整數均可以嗎?blog

答:必須是學生表中id列存在的數據,能夠經過外鍵約束進行數據的有效性驗證爲stuid添加外鍵約束ci

alter table scores add constraint stu_sco foreign key(stuid) references students(id);

此時插入或者修改數據時,若是stuid的值在students表中不存在則會報錯rem

在建立表時能夠直接建立約束io

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)
);

3、外鍵的級聯操做

在刪除students表的數據時,若是這個id值在scores中已經存在,則會拋異常table

推薦使用邏輯刪除,還能夠解決這個問題class

能夠建立表時指定級聯操做,也能夠在建立表後再修改外鍵的級聯操做

語法:

alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;

級聯操做的類型包括:

  • restrict(限制):默認值,拋異常
  • cascade(級聯):若是主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
  • set null:將外鍵設置爲空
  • no action:什麼都不作
相關文章
相關標籤/搜索