SQL中的幾種約束的建立與刪除
阿新 • • 發佈:2019-02-14
約束是SQL Server提供的自動保持資料庫完整性的一種方法, 它通過限制欄位中資料、記錄中資料和表之間的資料來保證資料的完整性。
約束可分為以下幾種:
1、PRIMARY KEY 主鍵約束
2、FOREIGN KEY 外來鍵約束
3、UNIQUE 約束 唯一約束
4、CHECK 約束 檢查約束
5、DEFUALT 定義 預設約束
一、主鍵約束
如果對多列定義了 PRIMARY KEY 約束,則一列中的值可能會重複,但來自 PRIMARY KEY 約束定義中所有列的任何值組合必須唯一。
如圖:
主鍵約束的定義: 1. 列中不允許有空值 2. 列中不允許有重複的值,即主鍵列中每個值都是唯一的。 3. 如果另一個表中的 FOREIGN KEY 約束引用了 PRIMARY KEY 約束,則必須先刪除 FOREIGN KEY 約束。 4. 表包含應用於自身的 PRIMARY XML 索引 主鍵的建立: 1、 在建立表時建立 PRIMARY KEY 約束 以下是AdventureWorks2008R2 示例資料庫中 Employee 表(允許系統提供約束名)的 BusinessEntityID 列具有聚集索引的 PRIMARY KEY 約束的列定義
BusinessEntityID int
PRIMARY KEY CLUSTERED
2、為現有表建立或刪除 PRIMARY KEY 約束
USE AdventureWorks2008R2;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON );
GO
3、刪除主鍵約束
使用表設計器,在表網格中右鍵單擊包含主鍵的行,再選擇“移除主鍵”以將該設定從啟用切換到禁用。
或者新建查詢檔案,鍵入
USE AdventureWorks2008R2;
GO
--修改表Production
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
GO
“`
二、FOREIGN KEY 外來鍵約束
外來鍵 (FK) 是用於建立和加強兩個表資料之間的連結的一列或多列。當建立或修改表時可通過定義 FOREIGN KEY 約束來建立外來鍵。
例如,因為銷售訂單和銷售人員之間存在一種邏輯關係,所以 AdventureWorks2008R2 資料庫中的 Sales.SalesOrderHeader 表含有一個指向 Sales.SalesPerson 表的連結。SalesOrderHeader 表中的 SalesPersonID 列與 SalesPerson 表中的主鍵列相對應。SalesOrderHeader 表中的 SalesPersonID 列是指向 SalesPerson 表的外來鍵。
外來鍵約束要遵循引用完整性原則
建立外來鍵約束的基本格式為:
FOREIGN KEY(列名) REFERENCES 被參照表名(列名)
例:
1、建立表時新增外來鍵約束
SalesPersonID int NULL
REFERENCES SalesPerson(BusinessEntityID)
2、修添改表時加約束,顯示指定外來鍵約束兩個表中列名不必相同
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(BusinessEntityID)
3、刪除外來鍵
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact
三、UNIQUE 約束 唯一約束
唯一約束可確保在非主鍵列中不輸入重複的值,可以對一個表定義多個唯一約束
1、在建表時建立唯一約束:
Name nvarchar(100) NOT NULL
UNIQUE NONCLUSTERED
2、在現有表中建立 UNIQUE 約束
新建查詢,鍵入
USE DATABASE1 --使用DATABASE1資料庫
ALTER TABLE T1 --修改表T1
CONSTRAINT UQ_ID UNIQUE(ID) --為名為ID列的唯一約束
3、刪除唯一約束
```
CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ; --指定表和唯一約束的列
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
```
4、CHECK 約束 檢查約束
檢查約束常用來檢查某列的元素值是否在合理的範圍之內,CHECK 約束可以強制域的完整性.
1、在建立表時建立檢查約束
CreditRating int NOT NULL
CHECK (CreditRating >= 1 and CreditRating <= 5), --將CreditRating 的值約束在1到5之間
2、在修改表時建立約束
CREATE TABLE dbo.doc_exd
--將使用 WITH NOCHECK 以避免根據現有行驗證該約束
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (CreditRating >= 1 and CreditRating <= 5),
注:不能在 text、ntext 或 image 列上定義 CHECK 約束
3、刪除CHECK約束
ALTER TABLE doc_exd.CreditRating
DROP CONSTRAINT CK_CreditRating ;
5、DEFUALT 定義 預設約束
預設約束強制資料完整性,記錄中的每列均必須有值,即使該值是 NULL。
使用預設約束可在表中的列元素預設的情況下(未填入)為列中的每個元素設定預設值。
DEFAULT 定義和列的為空性所定義的列中的值可歸納如下表中所示:
1、在建表時新增預設約束
Position nvarchar(20) NULL
--為職位賦一個預設的字串
DEFAULT 'New Position - title not formalized yet',
2、在現有表中新增預設約束
ALTER TABLE dbo.T1
ADD CONSTRAINT Position
DEFAULT 'New Position - title not formalized yet' FOR Position ;
3、刪除預設值
語法DROP DEFAULT { [ schema_name . ] default_name } [ ,...n ] [ ; ]
USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.objects
WHERE name = 'datedflt'
AND type = 'D')
DROP DEFAULT datedflt
GO