触发器 删除主键前先删除外键

触发器 删除主键前先删除外键,第1张

如果要删除 主表, 自动删除 子表数据的外键.

那么创建外键的时候,使用 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6677192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存