使用可能的循环依赖关系创建SQL约束

时间:2012-07-17 07:38:31

标签: sql sql-server constraints circular-dependency

我有以下表结构(虚构,演示):

ArticlePrice
------------
Id (int, identity)
Price (float)

SpecialArticlePrice
-------------------
Id (int, identity)
ArticlePriceId (int, FK to AriclePrice.Id)
SpecialPrice (float)

在这些表之间是一个删除约束。

Foo
-----
Id (int, identity)
ArticlePriceId (int, NULL, FKto ArticlePrice.Id)
SpecialArticlePriceId (int, NULL, FK to SpecialArticlePrice.Id)
Price (int)

如果要删除ArticelPrice或SpecialArticlePrice,我想为两个FK设置删除约束,也应该删除Foo记录。 唯一的合同(在开发者网站上)是,Foo的记录只能保持一个FK关系。

示例:

INSERT INTO Foo (ArticlePrice, SpecialArticlePrice, Price) VALUES (13, NULL, 20.0) 
INSERT INTO Foo (ArticlePrice, SpecialArticlePrice, Price) VALUES (NULL, 3, 134.25)

我该如何解决这种情况?

非常感谢你。 亲切的问候, 丹尼

3 个答案:

答案 0 :(得分:2)

您需要在ArticlePrice和SpecialArticlePrice表格上创建DELETE TRIGGERS

create trigger trgArticlePriceDelete on ArticlePrice for delete
as
begin
delete foo 
from foo
        inner join deleted on foo.ArticlePriceID = deleted.ID
end
go

create trigger trgSpecialArticlePriceDelete on SpecialArticlePrice for delete
as
begin
    delete foo 
    from
        foo
        inner join deleted on foo.SpecialArticlePriceID = deleted.ID
end
go

此外,您不应将价格存储为浮点数。使用moneydecimal类型

答案 1 :(得分:0)

我不知道我是否得到了你真正想要的东西但是:

如果在SSMS中设计Foo-Table,则必须插入外键。 然后,您需要设置SpecialPrice-Table和ArticlePrice-Table的外键的“插入和更新规范”(与表Foo的关系) - >只需将删除规则设置为级联即可。

因此,每次删除ArticlePrice或SpecialArticlePrice时,也应删除引用这些项的行。

答案 2 :(得分:0)

您可以将触发器与存储过程一起使用。 SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?

非常感谢, 吉里什