我有以下表结构(虚构,演示):
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)
我该如何解决这种情况?
非常感谢你。 亲切的问候, 丹尼
答案 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
此外,您不应将价格存储为浮点数。使用money
或decimal
类型
答案 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?
非常感谢, 吉里什