MySQL(9) 關係與外來鍵

2021-08-21 00:24:29 字數 1905 閱讀 7197

1.建立成績表(scores)

建立成績表scores,結構中字段為

id、學生、

科目、成績。

思考:學生列應該存什麼資訊呢?

答:學生列的資料不是在這裡新建的,而應該從學生表引用過來,關係也是一條資料;根據正規化要求應該儲存學生的編號,而不是學生的姓名等其它資訊;

同理,科目表也是關係列,引用科目表中的資料。

兩張表之間的對應關係指的是資料行的對應關係。如一行學生資料能對應多行成績資料,每一行成績資料只能對應一行學生資料(即乙個學生);一行成績資料只能對應一行科目資料(即乙個科目),但一行科目資料能對應多行成績資料。

一對一的資料表設計通常用於優化,比如同一張表中一部分資訊常用,另一部分不常用,這時候為了優化就可以將其拆分為兩張表,這兩張表就是一對一的關係;一對多或者多對多就是上圖所示的情況;多對多的情況,會再設計乙個資料表(我個人猜想新設計的資料表應該是以該新資料表為橋梁,將多對多拆成兩個一對多)

不能夠把上圖的箭頭線畫成閉合的(即a和c也存在關係),這樣說明產生了冗餘資料。

建立表的語句如下

create table scores(

id int primary key auto_increment,

stuid int,

subid int,

score decimal(5,2)

);

2.外來鍵

思考:怎麼保證關係列資料的有效性呢?任何整數都可以嗎?

答:必須是學生表中id列存在的資料,可以通過外來鍵約束進行資料的有效性驗證。

(1)scores表已建立後通過修改表結構進行外來鍵約束

alter table scores add constraint stu_sco foreign key(stuid) references students(id);
此時插入或者修改資料時,如果stuid的值在students表中不存在則會報錯!

(2)在建立表時可以直接建立約束

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中已經存在,則會拋異常。

一般盡量少使用

外來鍵的級聯操作,可以盡量多使用邏輯刪除來解決問題。

可以在建立表時指定級聯操作,也可以在建立表後再修改外來鍵的級聯操作

語法(建立表後修改):

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

//以上為兩張表的關聯操作,若是自關聯則scores表需與students表同為一張表才行

//將上述的add改為drop即變為刪除外來鍵的操作

級聯操作的型別包括:

restrict(限制):預設值,拋異常

set null:將外來鍵設定為空

no action:什麼都不做

4.如何在關係實體間建立外來鍵

(1)確定實體間是否有關係

(2)確定是幾對幾的關係

(3)確定在哪個實體中建立字段

MySql的關係(外來鍵)

比如 建立成績表scores,結構如下 1.建立關係 1.1外來鍵約束 有二種 1.1.1建立表時可以直接建立約束 create table scores id int primary key auto increment,stuid int,subid int,score decimal 5,2 ...

關係與外來鍵約束

id 學生科目 成績create table scores id int primary keyauto increment,stuid int,subid int,score decimal 5,2 一對一 假設獨身子女 學生表 id,學生名字,科目,成績,motherid,fatherid 母親...

MySQL外來鍵與主表關係設定說明

目錄 1 使用場景 2 實現 3 總結 4 mysql查詢資料庫哪些表引用了相同的外來鍵表 5 參考文章 目前大型網際網路企業一般都禁止使用外來鍵 主要是通過程式控制關聯表之中外來鍵約束關係 但是一些中小企業之中開發之中還是有不少人使用外來鍵約束。下面根據實際情況說明一下設定外來鍵關係。在設定外來鍵...