2012-11-16 34 views
1

我正在测试不同的外键删除选项。我累了级联,没有动作,设置为null,所有作品,除了默认设置。 SQL SERVER报告错误:sql server 2008外键删除集默认不工作

消息547,级别16,状态0,行1 DELETE语句与FOREIGN KEY约束“FK_child_parent”冲突。冲突发生在数据库“Test”,表“dbo.Test_parent”,列'no'。 该声明已被终止。

create table Test_parent(
    [no] int primary key  
) 

CREATE TABLE test_child(
    SUB1 INT, 
    [NO] int DEFAULT 0 CONSTRAINT FK_child_parent REFERENCES Test_parent([no]) ON DELETE set default 
) 

insert into Test_parent values(1),(2) 

insert into test_child values(1, 1) 
insert into test_child values(2, 1) 

delete from Test_parent 

回答

1

您删除了您的父表,这会触发子级中的默认设置。数据库尝试将子记录设置为其默认0。但父表中没有0记录,触发外键违规。

+0

那么设置默认值有什么意义?我认为它会像set null一样工作,但会将列设置为某个默认值。你能举一个例子,设置默认是有意义的吗? – thotwielder

+1

如果您的父表中有'0'记录,那么这将是一个正确的默认值。例如考虑一个库存系统。如果你删除一个类别,那个类别的产品不能仅仅消失 - 它们仍然存在。所以你建立了一个永久的“默认”类别,例如id = 0,这样当你删除“坏圣诞礼物”类别时,奶奶的丑陋毛衣就会进入“默认”类别。 –

+0

优秀!谢谢。 – thotwielder