資料庫中的五種約束

来源:https://www.cnblogs.com/tianming18/archive/2019/01/14/10267861.html
-Advertisement-
Play Games

資料庫中的五種約束及其添加方法 五大約束 1.—-主鍵約束(Primay Key Coustraint) 唯一性,非空性 2.—-唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個 3.—-檢查約束 (Check Counstraint) 對該列數據的範圍、格式的限制(如 ...


資料庫中的五種約束及其添加方法

五大約束

1.—-主鍵約束(Primay Key Coustraint) 唯一性,非空性

 2.—-唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個

 3.—-檢查約束 (Check Counstraint) 對該列數據的範圍、格式的限制(如:年齡、性別等)

 4.—-預設約束 (Default Counstraint) 該數據的預設值

 5.—-外鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關係並引用主表的列

五大約束的語法示例

 1.—-添加主鍵約束(將stuNo作為主鍵)

 alter table stuInfo

 add constraint PK_stuNo primary key (stuNo)

 2.—-添加唯一約束(身份證號唯一,因為每個人的都不一樣)

 alter table stuInfo

 add constraint UQ_stuID unique(stuID)

 3.—-添加預設約束(如果地址不填 預設為“地址不詳”)

 alter table stuInfo

 add constraint DF_stuAddress default (‘地址不詳’) for stuAddress

 4.—-添加檢查約束 (對年齡加以限定 15-40歲之間)

 alter table stuInfo

 add constraint CK_stuAge check (stuAge between 15 and 40)

alter table stuInfo

 add constraint CK_stuSex check (stuSex=’男’ or stuSex=’女′)

5.—-添加外鍵約束 (主表stuInfo和從表stuMarks建立關係,關聯欄位stuNo)

alter table stuInfo

 add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)

 約束(Constraint)是Microsoft SQL Server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的數據的限制條件(有關數據完整性的介紹請參見第9 章)。在SQL Server 中有5 種約束:主關鍵字約束(Primary Key Constraint)、外關鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和預設約束(Default Constraint)。

1 主關鍵字約束

 主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。

 定義主關鍵字約束的語法如下:

 CONSTRAINT constraint_name

 PRIMARY KEY [CLUSTERED | NONCLUSTERED]

 (column_name1[, column_name2,…,column_name16])

 各參數說明如下:

 constraint_name

 指定約束的名稱約束的名稱。在資料庫中應是惟一的。如果不指定,則系統會自動生成一個約束名。

 CLUSTERED | NONCLUSTERED

 指定索引類別,CLUSTERED 為預設值。其具體信息請參見下一章。

 column_name

 指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。

例7-3: 創建一個產品信息表,以產品編號和名稱為主關鍵字

 create table products (

 p_id char(8) not null,

 p_name char(10) not null ,

 price money default 0.01 ,

 quantity smallint null ,

 constraint pk_p_id primary key (p_id, p_name)

 ) on [primary]

2 外關鍵字約束

 外關鍵字約束定義了表之間的關係。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合哪個表中哪些列相關聯。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當向含有外關鍵字的表插入數據時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入數據。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16 個列組成。

 定義外關鍵字約束的語法如下:

 CONSTRAINT constraint_name

 FOREIGN KEY (column_name1[, column_name2,…,column_name16])

 REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]

 [ ON DELETE { CASCADE | NO ACTION } ]

 [ ON UPDATE { CASCADE | NO ACTION } ] ]

 [ NOT FOR REPLICATION ]

 各參數說明如下:

REFERENCES

 指定要建立關聯的表的信息。

 ref_table

 指定要建立關聯的表的名稱。

 ref_column

 指定要建立關聯的表中的相關列的名稱。

 ON DELETE {CASCADE | NO ACTION}

 指定在刪除表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在刪除父表數據行時會將子表中對應的數據行刪除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的刪除操作回滾。NO ACTION 是預設值。

 ON UPDATE {CASCADE | NO ACTION}

 指定在更新表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在更新父表數據行時會將子表中對應的數據行更新;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的更新操作回滾。NO ACTION 是預設值。

 NOT FOR REPLICATION

 指定列的外關鍵字約束在把從其它表中複製的數據插入到表中時不發生作用。

 例7-4:創建一個訂貨表,與前面創建的產品表相關聯

 create table   orders(

 order_id char(8),

 p_id char(8),

 p_name char(10) ,

 constraint pk_order_id primary key (order_id) ,

 foreign key(p_id, p_name) references products(p_id, p_name)

 ) on [primary]

 註意:臨時表不能指定外關鍵字約束。

惟一性約束

 惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重覆的值。惟一性約束指定的列可以有NULL 屬性。由於主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成。

 定義惟一性約束的語法如下:

 CONSTRAINT constraint_name

 UNIQUE [CLUSTERED | NONCLUSTERED]

 (column_name1[, column_name2,…,column_name16])

例7-5:定義一個員工信息表,其中員工的身份證號具有惟一性。

create table employees (

 emp_id char(8),

 emp_name char(10) ,

 emp_cardid char(18),

 constraint pk_emp_id primary key (emp_id),

 constraint uk_emp_cardid unique (emp_cardid)

 ) on [primary]

7.2.4 檢查約束

 檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證資料庫的數據完整性。可以對每個列設置符合檢查。

 定義檢查約束的語法如下:

 CONSTRAINT constraint_name

 CHECK [NOT FOR REPLICATION]

 (logical_expression)

 各參數說明如下:

 NOT FOR REPLICATION

 指定檢查約束在把從其它表中複製的數據插入到表中時不發生作用。

 logical_expression

 指定邏輯條件表達式返回值為TRUE 或FALSE。

 例7-6: 創建一個訂貨表其中定貨量必須不小於10。

 create table   orders(

 order_id char(8),

 p_id char(8),

 p_name char(10) ,

 quantity smallint,

 constraint pk_order_id primary key (order_id),

constraint chk_quantity check (quantity>=10) ,

 ) on [primary]

 註意:對計算列不能作除檢查約束外的任何約束。

7.2.5 預設約束

 預設約束通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設約束,而不使用定義預設值的方式來指定列的預設值。有關綁定預設約束的方法請參見“數據完整性”章節。

 定義預設約束的語法如下:

 CONSTRAINT constraint_name

 DEFAULT constant_expression [FOR column_name]

 例7-7:

 constraint de_order_quantity default 100 for   order_quantity

 註意:不能在創建表時定義預設約束,只能向已經創建好的表中添加預設約束。

7.2.6 列約束和表約束

 對於資料庫來說,約束又分為列約束(Column Constraint)和表約束(Table Constraint)。

 列約束作為列定義的一部分只作用於此列本身。表約束作為表定義的一部分,可以作用於

 多個列。

 下麵舉例說明列約束與表約束的區別。

 例7-8:

 create table products (

 p_id char(8) ,

 p_name char(10) ,

 price money default 0.01 ,

 quantity smallint check (quantity>=10) , /* 列約束 */

 constraint pk_p_id primary key (p_id, p_name) /* 表約束 */

 


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

-Advertisement-
Play Games
更多相關文章
  • 目錄 一、製作linux啟動盤 1.1. 準備工作 1.2. 製作linux系統U盤 二、使用U盤安裝Centos7.6 2.1. 使用U盤啟動 2.2. 更改安裝配置 2.3. 開始安裝 回到頂部 一、製作linux啟動盤 使用光碟刻錄軟體將系統鏡像刻錄到U盤後使用U盤安裝系統。 1、 準備 1個 ...
  • 自上而下從應用層到底層分析 app: QQ、微信、游戲、控制界面 GUI圖形用戶界面(Graphical User Interface,簡稱 GUI,又稱圖形用戶介面):QT(C++)、Android(java)、GTK(C) 文件系統 內核:Linux、Android、windows Bootlo ...
  • [root@nfs01 backup]# rsync -avz /backup [email protected]::backupPassword: @ERROR: auth failed on module backuprsync error: error starting clie ...
  • 博主的電腦是Win10系統,在修改完系統的用戶文件夾名後,桌面右擊出現了反應卡頓的現象,並且點擊輸入法,也變得卡頓。問題解決後,於是想簡單記錄一下。 還是註冊表的問題,使用Win+R快捷鍵,打開運行,輸入regedit,開啟註冊表編輯器,按照路徑順序打開 HKEY_CLASSES_ROOT\Dire ...
  • 一. 回憶主從複製的一些缺點 上節說到主從複製的一些問題 我們再來回憶一下 主從複製,增加了一個資料庫副本,從資料庫和主資料庫的數據最終會是一致的 之所以說是最終一致,因為mysql複製是非同步的,正常情況下主從複製數據之間會有一個微小的延遲 通過這個資料庫副本看似解決了資料庫單點問題,但並不完美 因 ...
  • 如何進行讀寫分離 由開發人員根據所執行的SQL類型連接不同的伺服器 由資料庫中間層實現讀寫分離 讀寫分離時,需要註意,對於實時性要求比較高的數據,不適合在從庫上查詢(因為主從複製存在一定延遲(毫秒級)),比如庫存就應該在主庫上查詢,如果放在從庫上查詢,可能會存在超賣的情況 由開發人員根據所執行的SQ ...
  • mysql客戶端可用選項: -A, --no-auto-rehash 禁止補全 -u, --user= 用戶名,預設為root -h, --host= 伺服器主機,預設為localhost -p, --passowrd= 用戶密碼,建議使用-p,預設為空密碼 -P, --port= 伺服器埠 -S ...
  • 一、安裝&完全卸載 1、引導式安裝 https://dev.mysql.com/downloads/installer/ 2、下載壓縮包,解壓後用控制台安裝 初始化 mysqld --initialize-insecure 安裝 mysqld --install 啟動服務 net start mys ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...