触发器 删除主键前先删除外键
用的是sqlserver2005,网上找到不少相似的答案,但是企业管理器总报错。我有一张VIP表,主键是V_NO,表VB的里的V_No作为外键与V_NO相关。在删除VIP...
用的是sql server 2005,网上找到不少相似的答案,但是企业管理器总报错。
我有一张VIP表,主键是V_NO,表VB的里的V_No作为外键与V_NO相关。在删除VIP表里的某行前先删除VB里对应的行,用触发器实现,怎么写呢? 展开
我有一张VIP表,主键是V_NO,表VB的里的V_No作为外键与V_NO相关。在删除VIP表里的某行前先删除VB里对应的行,用触发器实现,怎么写呢? 展开
3个回答
展开全部
如果要删除 主表, 自动删除 子表数据的外键.
那么创建外键的时候,使用 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_NO VIP_DATA
----------- ----------
1 VIP1
2 VIP2
(2 行受影响)
VB_ID V_No VB_DATE
----------- ----------- ----------
1 1 VB1
2 1 VB2
3 2 VB3
4 2 VB4
(4 行受影响)
那么创建外键的时候,使用 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_NO VIP_DATA
----------- ----------
1 VIP1
2 VIP2
(2 行受影响)
VB_ID V_No VB_DATE
----------- ----------- ----------
1 1 VB1
2 1 VB2
3 2 VB3
4 2 VB4
(4 行受影响)
展开全部
大概是这样
create tgigger tr_del_VIP ON VIP
instead of delete
AS
delete VB where V_NO in(select V_NO from deleted)
delete VIP where V_NO in(select V_NO from deleted)
create tgigger tr_del_VIP ON VIP
instead of delete
AS
delete VB where V_NO in(select V_NO from deleted)
delete VIP where V_NO in(select V_NO from deleted)
追问
= =无法通过检查都
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create trigger triggername on VIP
for delete
as
begin
delete from VB where V_NO=(select V_no from deleted)
end
for delete
as
begin
delete from VB where V_NO=(select V_no from deleted)
end
追问
还是冲突.在VIP表中的V_NO中O是大写的,VB表中的o是小写的。。不小心弄得。
你这样写的意思是不是在VIP表的数据删除后再在VB表中自动删除相应数据??,只是实现了自动在VB中删除的功能,可是VIP表中的就先删除不成功吧?
是不是要用到before什么的。
追答
一定要用触发么?用存储过程不是更好么,而且能够节省开销。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询