1. 程式人生 > >SQL server :主鍵和外鍵

SQL server :主鍵和外鍵

技術分享 div 標識 reference create reat 按鈕 sse 是的

1.定義

  • 1.1 什麽是主鍵和外鍵
  • 1.2 主鍵和外鍵的作用
  • 1.3 主鍵、外鍵和索引的區別

2.主鍵(primary key)

  • 2.1 通過SSMS設置主鍵
  • 2.2 通過SQL語句設置主鍵

3.外鍵(foreign key)

  • 3.1 通過SSMS設置外鍵
  • 3.2 通過SQL語句設置外鍵

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

  • 4.1 已存在表設置主鍵
  • 4.2 已存在表設置外鍵

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)

SQL server :主鍵和外鍵