>= 3
deptid deptname deptmgrid
----------- ------------------------- -----------
1 HR 2
2 Marketing 7
對新的 DRI 操作的支持:
SET DEFAULT 和 SET NULL
ANSI SQL 定義了四個可能的引用操作,以支持 FOREIGN KEY 約束。您可以指定這些操作,以表明您希望系統如何響應針對由外鍵引用的表的 DELETE 或 UPDATE 操作。SQL Server 2000 支持這些操作中的兩個:NO ACTION 和 CASCADE。SQL Server 2005 Beta 2 添加了對 SET DEFAULT 和 SET NULL 引用操作的支持。
SET DEFAULT 和 SET NULL 引用操作擴展了聲明性引用完整性 (DRI) 功能。您可以在外鍵聲明中將這些選項與 ON UPDATE 和 ON DELETE 子句結合使用。SET DEFAULT 意味著,當您在被引用的表中刪除行 (ON DELETE) 或更新被引用的鍵 (ON UPDATE) 時,SQL Server 會將引用表中的相關行的引用列值設置為該列的默認值。類似地,如果您使用 SET NULL 選項,則 SQL Server 可以通過將值設置為 NULL 進行反應(前提是引用列允許使用空值)。
例如,以下 Customers 表具有三個真實客戶和一個虛擬客戶:
CREATE TABLE Customers
(
customerid CHAR(5) NOT NULL,
/* other columns */
CONSTRAINT PK_Customers PRIMARY KEY(customerid)
)
INSERT INTO Customers VALUES('DUMMY')
INSERT INTO Customers VALUES('FRIDA')
INSERT INTO Customers VALUES('GNDLF')
INSERT INTO Customers VALUES('BILLY')
Orders 表跟蹤定單。不一定非要將定單分配給真實客戶。如果您輸入一個定單並且未指定客戶 ID,則默認情況下會將 DUMMY 客戶 ID 分配給該定單。在從 Customers 表中進行刪除時,您希望 SQL Server 在 Orders 中的相關行的 customerid 列中設置 NULL。customerid 列中含有 NULL 的定單成為“孤兒”,也就是說,它們不屬於任何客戶。假設您還希望允許對 Customers 中的 customerid 列進行更新。您可能希望將對 Orders 中的相關行進行的更新級聯,但是假設公司的業務規則另行規定:應當將屬於 ID 被更改的客戶的定單與默認客戶 (DUMMY) 相關聯。在對 Customers 中的 customerid 列進行更新時,您希望 SQL Server 將默認值 'DUMMY' 設置為 Orders 中的相關客戶 ID (customerid)。您用外鍵按如下方式創建 Orders 表,並且用一些定單填充它:
CREATE TABLE Orders
(
orderid INT NOT NULL,
customerid CHAR(5) NULL DEFAULT('DUMMY'),
orderdate DATETIME N
'20040103')
INSERT INTO Orders VALUES(10005, 'GNDLF', '20040104')
INSERT INTO Orders VALUES(10006, 'GNDLF', '20040105')
要測試 SET NULL 和 SET DEFAULT 選項,請發出下列 DELETE 和 UPDATE 語句:
DELETE FROM Customers
WHERE customerid = 'FRIDA'
UPDATE Customers
SET customerid = 'DOLLY'
WHERE customerid = 'BILLY'
結果,FRIDA 的定單被分配 customerid 列中的空值,而 BILLY 的定單被分配 DUMMY:
orderid customerid orderdate
----------- ---------- ----------------------
10001 NULL 1/1/2004 12:00:00 AM
10002 NULL 1/2/2004 12:00:00 AM
10003 DUMMY 1/1/2004 12:00:00 AM
10004 DUMMY 1/3/2004 12:00:00 AM
10005 GNDLF 1/4/2004 12:00:00 AM
10006 GNDLF 1/5/2004 12:00:00 AM
請注意,如果您使用 SET DEFAULT 選項,引用列具有非空默認值且該值在被引用的表中不具有相應值,則當您發出觸發操作時,將獲得錯誤。例如,如果您從 Customers 中刪除 DUMMY 客戶,然後將 GNDLF 的 customerid 更新為 GLDRL,則會獲得錯誤。UPDATE 觸發一個 SET DEFAULT 操作,該操作試圖向 GNDLF 的原始定單分配在 Customers 中不具有相應行的 DUMMY 客戶 ID:
DELETE FROM Cust