级联删除(ON DELETE CASCADE的用法)
在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差不多