entityframework删除主键表 外键会自动删除吗
1个回答
2015-03-22
展开全部
如果要删除 主表, 自动删除 子表数据的外键.
那么创建外键的时候,使用 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 行受影响)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询