那么创建外键的时候,使用 DELETE CASCADE 关键字就可以了.
SQL Server 外键约束的例子
http://hi.baidu.com/wangzhiqing999/blog/item/969f70fa84e2873e5d600821.html
那么2种选择.
1. 不创建外键, 直接使用触发器.
2. 暂时停用外键. 使用触发器.
为什么呢?
因为有 外键的情况下.
当你 DELETE FROM VIP 的时候。
数据库检查到你又外键存在,那么就直接拒绝你的删除 *** 作了。
删除 *** 作被拒绝, 那么触发器自然就执行不了。
下面是一个失败的例子
CREATE TABLE VIP (
V_NO INT PRIMARY KEY,
VIP_DATA VARCHAR(10)
)
go
CREATE TABLE VB (
VB_ID INT IDENTITY(1, 1) PRIMARY KEY,
V_No INT,
VB_DATE VARCHAR(10)
)
go
ALTER TABLE VB
ADD CONSTRAINT vip_id_cons
FOREIGN KEY (V_No) REFERENCES VIP
go
INSERT INTO VIP
SELECT 1, 'VIP1' UNION ALL
SELECT 2, 'VIP2' UNION ALL
SELECT 3, 'VIP3'
GO
INSERT INTO VB
SELECT 1, 'VB1' UNION ALL
SELECT 1, 'VB2' UNION ALL
SELECT 2, 'VB3' UNION ALL
SELECT 2, 'VB4' UNION ALL
SELECT 3, 'VB5' UNION ALL
SELECT 3, 'VB6'
GO
CREATE TRIGGER AfterDeleteVIP
ON VIP
FOR DELETE
AS
BEGIN
PRINT 'TEST'
DELETE FROM VB
WHERE
V_No IN (SELECT V_NO FROM deleted)
END
go
1>DELETE FROM VIP WHERE V_NO = 3
2>go
消息 547,级别 16,状态 1,服务器 WANG\SQLEXPRESS,第 1 行
DELETE 语句与 REFERENCE 约束"vip_id_cons"冲突。该冲突发生于数据库"Test",表"dbo.
VB", column 'V_No'。
语句已终止。
假如我现在 停用掉外键约束。
1>ALTER TABLE VB NOCHECK CONSTRAINT vip_id_cons
2>go
再次删除主表的数据, 显示触发器成功的执行了。
1>DELETE FROM VIP WHERE V_NO = 3
2>go
TEST
(2 行受影响)
-- 核对数据,显示触发器也被正常的执行。
1>select * FROM VIP
2>select * FROM VB
3>GO
V_NOVIP_DATA
----------- ----------
1 VIP1
2 VIP2
(2 行受影响)
VB_ID V_NoVB_DATE
----------- ----------- ----------
1 1 VB1
2 1 VB2
3 2 VB3
4 2 VB4
(4 行受影响)
有外键的情况下一般要先关掉外键的作用,然后删除,在开启。以为有外键的表一般不能删除的。如果是mysql数据库的话先关闭外键
SET FOREIGN_KEY_CHECKS=0
然后删除
在开启
SET FOREIGN_KEY_CHECKS=1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)