SQL Server學習之路(二):主鍵和外鍵

来源:http://www.cnblogs.com/PyLearn/archive/2017/10/03/7624768.html
-Advertisement-
Play Games

通過SSMS設置主鍵外鍵,使用SQL語句分別在建表中和建表後設置主鍵外鍵 ...


0.目錄

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)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 BEGIN 2 set @n=(SELECT count(day) from log where day=CURDATE()); 3 IF @n=0 THEN 4 call m_LogInsert(); 5 ELSE 6 call m_LoginCheck(); 7 end if; 8 end ...
  • 過程1:帶返回值: 然後,執行過程,out輸出返回值: 過程2:不帶返回值: 執行過程: ...
  • 0.目錄 1. "前言" 2. "通過SSMS刪除" 3. "通過SQL語句刪除" 3.1 "刪除單行數據" 3.2 "刪除所有行數據" 3.3 "刪除表和資料庫" 1.前言 增刪改查都是對數據的操作,其中“刪”對應的SQL語句便是“delete”,也就是“刪除”的意思。 本篇主要介紹數據的刪除,分 ...
  • 如何判斷數據中某張表是否存在,如果不存在則創建它? 最笨的方法就是寫個select從表中讀數據,捕獲異常的同時就知道了改表沒有創建。 此法不通,因為這個時候的異常似乎被認定為了系統錯誤,於是後面創建表的代碼被忽略了。 大部分人的做法類似於select system.table where tabbl ...
  • 本文示例可見一斑了,主要是通過Java對SQL語句進行操作,和普通的增刪改查的原理是一樣的: 註:參考鏈接:http://blog.csdn.net/sd4015700/article/details/39668583 ...
  • 這個問題是因為在資料庫伺服器中的mysql資料庫中的user的表中沒有許可權(也可以說沒有用戶),下麵將記錄我遇到問題的過程及解決的方法。 在搭建完LNMP環境後用Navicate連接出錯 遇到這個問題首先到mysql所在的伺服器上用連接進行處理 1、連接伺服器: mysql -u root -p 2 ...
  • 0.目錄 1. "前言" 2. "通過SSMS添加數據" 3. "通過SQL語句添加數據" 3.1 "添加單條數據" 3.2 "添加多條數據" 4. "通過其他表導入數據" 4.1 "通過資料庫中的其他表導入數據" 4.2 "通過excel表導入數據" 1.前言 增刪改查都是對數據的操作,其中“增” ...
  • 1. CUDA Toolkit的安裝 到https://developer.nvidia.com/cuda-gpus查詢GPU支持的CUDA版本: 到https://developer.nvidia.com/cuda-downloads,根據操作系統選擇下載相應的CUDA Toolkit版本,下載的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...