創建數據庫表
USE SQL2016 IF OBJECT_ID('dbo.Employees','U') IS NOT NULL DROP TABLE dbo.Employees; Create TABLE dbo.Employees ( empid INT NOT NULL, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, salary Money Null ); USE SQL2016 IF OBJECT_ID('dbo.Orders','U') IS NOT NULL DROP TABLE dbo.Orders; Create TABLE dbo.Orders ( orderid INT NOT NULL, empid INT NOT NULL, customerid VARCHAR(30) NOT NULL, qty INT NOT Null, orderdatetime DATETIME2 NOT NULL, CONSTRAINT PK_Orders--建立表時,直接創建主鍵約束 PRIMARY KEY (orderid) );
--表已經存在,創建主鍵約束 ALTER TABLE dbo.Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(empid); --唯一約束 ALTER TABLE dbo.Employees ADD CONSTRAINT UNQ_Employees_lastname UNIQUE(lastname); --外鍵約束 ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Employees FOREIGN KEY(empid) REFERENCES dbo.Employees(empid); --CHECK約束 ALTER TABLE dbo.Employees Add CONSTRAINT CHK_Employees_Salary CHECK(salary>0.00); --默認約束 ALTER TABLE dbo.Orders ADD CONSTRAINT DFT_Orders_orders DEFAULT(SYSDATETIME()) FOR orderdatetime
創建測試數據
--創建測試數據 --以下兩段腳本創建了 兩個employee USE [SQL2016] GO INSERT INTO [dbo].[Employees] ([empid] ,[firstname] ,[lastname] ,[salary]) VALUES (1,'zhang','san',5000) GO INSERT INTO [dbo].[Employees] ([empid] ,[firstname] ,[lastname] ,[salary]) VALUES (2,'li','si',6000) GO --以下腳本創建了兩個orders USE [SQL2016] GO INSERT INTO [dbo].[Orders] ([orderid] ,[empid] ,[customerid] ,[qty]) VALUES (1,1,'CUS1',10) GO INSERT INTO [dbo].[Orders] ([orderid] ,[empid] ,[customerid] ,[qty]) VALUES (2,2,'CUS2',20) GO
驗證約束條件
驗證外鍵約束,empid為3的employee不存在,故以下腳本報錯
USE [SQL2016] GO INSERT INTO [dbo].[Orders] ([orderid] ,[empid] ,[customerid] ,[qty]) VALUES (3,10,'CUS1',10) GO

驗證外鍵約束,刪除主表記錄,主表中的值被其他表引用,empid=1的記錄在order中被引用,故刪除錯誤
USE [SQL2016] DELETE FROM dbo.Employees WHERE empid=1 GO

驗證外鍵約束,UPDATE主表記錄,主表中的值被其他表引用,empid=1的記錄在order表中被引用,故更新失敗
USE [SQL2016] UPDATE dbo.Employees set empid=4 where empid=1 GO

外鍵約束默認執行 no action引用操作,即delete 和 update 數據時,如果被引用,則默認不允許操作。

其他選項:
CASCADE:將級聯相關的行
SET DEFAULT:將相關行設置為默認值
SET NULL:將相關行設置為NULL
將Delete Rule 和Update Rule 改為 CASCADE后。
執行以下腳本,將empid=1改為4,刪除empid=2的記錄。則應該自動修改Orders里的empid=1的改為4,刪除empid=2的orders
USE [SQL2016] GO UPDATE dbo.Employees set empid=4 where empid=1 DELETE FROM dbo.Employees WHERE empid=2 GO SELECT * FROM dbo.Orders

CHECK 約束僅當false時拒絕操作,當為true和unknow時允許操作,例如
-1000,拒絕操作
5000,允許操作
NULL,允許操作
WITH NOCHECK 選項:
