Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可能的循环依赖项创建SQL约束_Sql_Sql Server_Constraints_Circular Dependency - Fatal编程技术网

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

使用可能的循环依赖项创建SQL约束,sql,sql-server,constraints,circular-dependency,Sql,Sql Server,Constraints,Circular Dependency,我有以下表格结构(虚构,以演示): 在这些表之间有一个删除约束 Foo ----- Id (int, identity) ArticlePriceId (int, NULL, FKto ArticlePrice.Id) SpecialArticlePriceId (int, NULL, FK to SpecialArticlePrice.Id) Price (int) 我想对两个FK都设置一个删除约束,以防ArticelPrice或SpecialArticlPrice被删除,Foo记录也应该被

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

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

Foo
-----
Id (int, identity)
ArticlePriceId (int, NULL, FKto ArticlePrice.Id)
SpecialArticlePriceId (int, NULL, FK to SpecialArticlePrice.Id)
Price (int)
我想对两个FK都设置一个删除约束,以防ArticelPrice或SpecialArticlPrice被删除,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)
我如何解决这个问题

多谢各位。 亲切问候,,
Danny我不知道我是否得到了你真正想要的,但是:

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


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

您可以在存储过程中使用触发器。

非常感谢,,
Girish

您需要在ArticlePrice和SpecialArticlePrice表上创建
删除触发器

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
类型

不幸的是,由于循环依赖关系,不允许设置此规则;)如果我删除ArticlePrice记录,规则将删除SpecialPrice记录和Foo记录。之后,数据库希望再次删除Foo记录,因为SpecialArticlePrice和Foo之间有第二条规则。。。在我的场景中,不会同时设置两个FK,但数据库不知道这一点。我猜Oracle有点像NOCYCLE。我怀疑您是否有循环依赖关系。我建议您发布表的ddl。在这些表中插入一些数据,然后说从articleprice表中删除一行,并显示您对其他表的预期输出。然后从specialarticleprice中删除一行,并指定您期望其他两个表的输出。这样人们就可以更快地提供帮助。不起作用。在执行任何触发操作之前,将检查FKs。解决方案是使用该类型的触发器而不是DELETE。
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