1. 程式人生 > >主鍵和外來鍵

主鍵和外來鍵

1.定義

2.主鍵(primary key)

3.外來鍵(foreign key)

4.SQL語句向已存在表設定主鍵和外來鍵

1.定義

1.1 什麼是主鍵和外來鍵

關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵。
比如:
學生表(學號,姓名,性別,班級)
其中每個學生的學號是唯一的,學號就是一個主鍵

課程表(課程編號,課程名,學分)
其中課程編號是唯一的,課程編號就是一個主鍵

成績表(學號,課程號,成績)
成績表中單一一個屬性無法唯一標識一條記錄,學號和課程號的組合才可以唯一標識一條記錄,所以 學號和課程號的屬性組是一個主鍵

成績表中的學號不是成績表的主鍵,但它和學生表中的學號相對應,並且學生表中的學號是學生表的主鍵,則稱成績表中的學號是學生表的外來鍵

1.2 主鍵和外來鍵的作用

1.2.1為了維護關係資料庫的完整性:


主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。

外來鍵用於與另一張表的關聯。是能確定另一張表記錄的欄位,用於保持資料的一致性。比如,A表中的一個欄位,是B表的主鍵,那他就可以是A表的外來鍵。

1.2.2起約束作用:
外來鍵取值規則:空值或參照的主鍵值。
(1)插入非空值時,如果主鍵表中沒有這個值,則不能插入。
(2)更新時,不能改為主鍵表中沒有的值。
(3)刪除主鍵表記錄時,你可以在建外來鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。
(4)更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。

1.3 主鍵、外來鍵和索引的區別

區別 主鍵 外來鍵 索引
定義 唯一標識一條記錄,不能有重複的,不允許為空 表的外來鍵是另一表的主鍵, 外來鍵可以有重複的, 可以是空值 該欄位沒有重複值,但可以有一個空值
作用 用來保證資料完整性 用來和其他表建立聯絡用的 是提高查詢排序的速度
個數 主鍵只能有一個 一個表可以有多個外來鍵 一個表可以有多個唯一索引

參考網站:SQL的主鍵和外來鍵的作用

2.主鍵(primary key)

2.1 通過SSMS設定主鍵

2.1.1開啟之前建立的表,即選擇 資料庫->SSMSTest->表->dbo.student 右鍵單擊dbo.student選擇設計。

2.1.2在sno處右鍵單擊選擇設定主鍵。

2.1.3這時可以看到sno前面出現了一個鑰匙一樣的圖示,這就代表著sno已經被設定為主鍵了。點選一下儲存或者按Ctrl+S就可以儲存了。
2.1.4按照以上步驟開啟dbo.course,右鍵單擊cno選擇設定主鍵。儲存。

2.1.5按照以上步驟開啟dbo.sc,按住shift依次點選sno和cno前面的小框按鈕,就可以同時選中這兩行。然後再右鍵單擊選擇設定主鍵。儲存。

2.1.6至此,已經完成了三張表的主鍵設定。

2.2 通過SQL語句設定主鍵

2.2.1選擇 資料庫->SQLTest,點選新建查詢,注意左上角的框裡是SQLTest,不是的話手動選擇一下。

2.2.2在點選新建查詢出來的介面中輸入以下程式碼:

--這是SQL中的註釋資訊,使用兩個減號來註釋。
drop table student    --刪除表student
create table student  --建立表student
(sno char(4) primary key,  --設定sno為主鍵
sname char(8),
sage int,
ssex char(2),
sdept char(20)
)

drop table course    --刪除表course
create table course  --建立表course
(cno char(4) primary key,  --設定cno為主鍵
cname char(8),
cpno char(4),
ccredit int
)

drop table sc    --刪除表sc
create table sc  --建立表sc
(sno char(4),
cno char(4),
grade int,
primary key(sno, cno)  --設定sno和cno的屬性組為主鍵
)

2.2.3點選上面的執行,或者按F5之後出來瞭如下畫面。

2.2.4右鍵SQLTest點選重新整理或者按F5,然後選擇表,右鍵單擊選擇設計,能看到三張表都已經設定主鍵了。



2.2.5至此,已經完成了三張表的主鍵設定。

3.外來鍵(foreign key)

3.1 通過SSMS設定外來鍵

3.1.1選擇 資料庫->SSMSTest->表->dbo.sc 右鍵單擊dbo.sc選擇設計。

3.1.2右鍵單擊sno或者cno,選擇關係。

3.1.3點選左下角的新增。

3.1.4在 表和列規範 後面的框中點一下,就會出現後面的三個點的按鈕,點選三個點圖示的那個按鈕。

3.1.5因為sc中的sno引用了student中的sno,所以主鍵表那裡選擇student,然後選擇對應的sno。而sc中的cno因為引用的是course中的sc,所以在這裡沒法設定外來鍵,需要等下再設定,在這裡把它選擇為無。點選確定。


3.1.6再次點選左下角的新增。按照上述步驟將主鍵表選擇為course,選擇對應sc中的cno的course中的cno,並點選確定。



3.1.7點選關閉,然後儲存,在出現的警告中選擇是。


3.1.8選擇 資料庫->SSMSTest->資料庫關係圖 右鍵單擊選擇新建資料庫關係圖,在彈窗中選擇是,然後將三張表都新增,然後就可以看到三張表之間的關係了。



3.2 通過SQL語句設定外來鍵

3.2.1選擇 資料庫->SQLTest,然後選擇新建查詢。注意左上角的那個框中要選中SQLTest,如果不是的話就手動選擇一下。
3.2.2在新建查詢出來的介面中輸入以下程式碼:

--這是SQL中的註釋資訊,使用兩個減號來註釋。
drop table sc    --刪除表sc
create table sc  --建立表sc
(sno char(4) foreign key references student(sno),  --加外來鍵約束
cno char(4) foreign key references course(cno),  --加外來鍵約束
grade int,
primary key(sno, cno)  --設定sno和cno的屬性組為主鍵
)

3.2.3點選執行。

3.2.4選擇 資料庫->SSMSTest->資料庫關係圖 右鍵單擊選擇新建資料庫關係圖,在彈窗中選擇是,然後將三張表都新增,然後就可以看到三張表之間的關係了。

4.SQL語句向已存在表設定主鍵和外來鍵

4.1 已存在表設定主鍵

格式為:

alter table 表名
add constraint PK_欄位名--"PK"為主鍵的縮寫,欄位名為要在其上建立主鍵的欄位名,'PK__欄位名'就為約束名
primary key (欄位名) --欄位名同上

如:

alter table student
add constraint PK_sno
primary key (sno)

PS:如果執行以上程式碼有以下警告,說明在建表的時候沒有給sno新增非空約束,即需要在建表的時候使用以下程式碼。

drop table student    --刪除表student
create table student  --建立表student
(sno char(4) not null,  --加非空約束,不加"not null" 預設為:可以為空
sname char(8),
sage int,
ssex char(2),
sdept char(20)
)

4.2 已存在表設定外來鍵

格式為:

alter table 表名
add constraint FK_欄位名--"FK"為外來鍵的縮寫
foreign key (欄位名) references 關聯的表名(關聯的欄位名) --注意'關聯的表名'和'關聯的欄位名'

如:

alter table sc add constraint FK_sno foreign key (sno) references student(sno)