在SQL Server 2000中,增加了一個NO ACTION/CASCADE的新約束,對於外鍵約束也進行了相應的修改。這樣,我們就可以通過相應的設定來修改被參考表中的資料,同時與之有外鍵關係的表也自動進行相應的改動。我們通過以下很簡單的例子說明這個問題。
我們建立兩個表a和b,a和b的欄位都一樣,都是一個主鍵id和另外的一個欄位,我們暫且定義為cnt。然後:
ALTER TABLE b ADD CONSTRAINT FK_AAA FOREIGN KEY (id)
REFERENCE a(id)
這樣,a.id就成為b的外鍵了。通過兩個表的id相關聯。
然後我們進行插入操作:
insert into a (id, cnt) values(1,'aaa' )
insert into b (id, cnt) values(1,'bbb' )
然後我們這樣做:delete a
我們會發現,系統報錯,因為b.id和a.id相關聯,b.id要參照a.id。把a中的記錄刪除,b就失去了參照項,這樣,外鍵約束起作用了,顯示錯誤資訊。但是如果,我們外鍵這樣定義:
ALTER TABLE b ADD CONSTRAINT FK_AAA FOREIGN KEY (id)
REFERENCE a(id)
ON DELETE CASCADE
我們重複上述操作,當刪去了a中的記錄之後,會發現b中的記錄也被刪除了。如果我們的外鍵這樣定義:
ALTER TABLE b ADD CONSTRAINT FK_AAA FOREIGN KEY (id)
REFERENCE a(id)
ON DELETE NO ACTION
我們會發現系統依然報錯。
通過這個例子我相信大家都可以看明白NO ACTION/CASCADE的用法了
===================================================
CREATE TABLE Countries(CountryId INT PRIMARY KEY)
INSERT INTO Countries (CountryId) VALUES (1)
INSERT INTO Countries (CountryId) VALUES (2)
INSERT INTO Countries (CountryId) VALUES (3)
GO
CREATE TABLE Cities( CityId INT PRIMARY KEY ,CountryId INT REFERENCES Countries ON DELETE CASCADE);
INSERT INTO Cities VALUES(1,1)
INSERT INTO Cities VALUES(2,1)
INSERT INTO Cities VALUES(3,2)
GO
CREATE TABLE Buyers(CustomerId INT PRIMARY KEY ,CityId INT REFERENCES Cities ON DELETE CASCADE);
INSERT INTO Buyers VALUES(1,1),
INSERT INTO Buyers VALUES(2,1)
INSERT INTO Buyers VALUES(3,2)
GO
命令:
DELETE FROM Countries WHERE CountryId = 1
結果:
Countries:
CountryId
2
3
Cities:
CityId CountryId
3 2
Buyers:
CustomerId CityId
ON UPDATE CASCADE的用法和ON DELETE CASCADE差不多