1. 程式人生 > >SQL中的幾種約束的建立與刪除

SQL中的幾種約束的建立與刪除

約束是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