我有一条SQL语句,应该添加一些约束。在该语句中,我想在两个约束上设置两个参照完整性条件。
这是我的声明:
ALTER TABLE Vertraege
ADD CONSTRAINT FK_Kunde_Vertraege FOREIGN KEY(K_ID)
REFERENCES Kunde(K_ID),
CONSTRAINT FK_Standort_Vertraege FOREIGN KEY(S_ID)
REFERENCES Standort(S_ID) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Mitarbeiter_Vertraege FOREIGN KEY(M_ID)
REFERENCES Mitarbeiter(M_ID) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Dienstleistung_Vertraege FOREIGN KEY(D_ID)
REFERENCES Dienstleistung(D_ID),
CONSTRAINT FK_Compliance_Vertraege FOREIGN KEY(C_ID)
REFERENCES Compliance(C_ID);
问题在于,我因此而出错。
Notification 1785, level 16, status 0, line 28
Introducing FOREIGN KEY constraint 'FK_Mitarbeiter_Vertraege' on table 'vertreage' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Notification 1750, level 16, status 1, line 28
Could not create constraint or index. See previous errors.
是否可以设置多个引用完整性条件,如果没有,如何在SQL中设置多个?像ALTER CONSTRAINT
...
编辑
布莱恩问这个。在我的桌子上,我有以下限制。奇怪的是,它们有效
ALTER TABLE Mitarbeiter
ADD CONSTRAINT FK_Adresse_Mitarbeiter FOREIGN KEY(AD_ID)
REFERENCES Adresse(AD_ID) ON UPDATE CASCADE,
CONSTRAINT FK_Standort_Mitarbeiter FOREIGN KEY(S_ID)
REFERENCES Standort(S_ID) ON UPDATE CASCADE,
CONSTRAINT FK_Abteilung_Mitarbeiter FOREIGN KEY(AB_ID)
REFERENCES Abteilung(AB_ID) ON UPDATE CASCADE;
答案 0 :(得分:1)
这是一个猜测,因为问题并不包括所有相关表。
您正在尝试创建从表Vertraege
到表Mitarbeiter
的外键约束。但是,似乎从表Mitarbeiter
到表Vertraege
已有另一个[反向]外键约束(未显示)。我不确定,因为您没有包括表Mitarbeiter
的定义。
SQL Server将此视为“循环关系”。但是,这都是“合法的”。没错。好吧……只要其中一些可以为空,或者它们可以推迟(但SQL Server不会实现后者)。循环关系可能不仅涉及两个表,而且涉及三个或更多。但是,从这个问题尚不清楚,其中涉及多少个表。
问题源于您要指定的“级联删除/更新”规则。该规则可能会导致通过简单的无害DELETE
或UPDATE
删除或更新大量数据,例如:
delete from Vertraege where ID = 123
此语句似乎要删除一行。但是,您的级联删除规则最终可能会一次从多个表中删除数千行,而无需进一步确认。那是你想要的吗?
在任何情况下,SQL Server都不喜欢这些循环级联删除/更新,因为它认为它们[合理]危险,并决定不允许它们。
答案 1 :(得分:1)
该错误消息提到“多个级联路径”,并加上您添加到问题中的其他约束,我首先怀疑以下各项之间存在交互作用(从您的初始文章中编辑):
ALTER TABLE Vertraege
CONSTRAINT FK_Standort_Vertraege FOREIGN KEY(S_ID)
REFERENCES Standort(S_ID) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Mitarbeiter_Vertraege FOREIGN KEY(M_ID)
REFERENCES Mitarbeiter(M_ID) ON UPDATE CASCADE ON DELETE CASCADE,
和
ALTER TABLE Mitarbeiter
CONSTRAINT FK_Standort_Mitarbeiter FOREIGN KEY(S_ID)
REFERENCES Standort(S_ID) ON UPDATE CASCADE,
因此,您有一个约束,它直接从Vertraege
到Standort
,另一个约束是从Vertraege
到Mitarbeiter
到Standort
。我的第一个建议是删除FK_Standort_Vertraege
,看看是否能解决您的问题。
答案 2 :(得分:0)
感谢Brian给您的投入。解决方案非常简单(请参见Brians和The Impalers的答案)。我只是不能在具有某些关系的表中使用参照完整性条件,而表中的某些关系与参照完整性条件具有其他关系。
这是我的工作声明,没有任何错误:
ALTER TABLE Vertraege
ADD CONSTRAINT FK_Kunde_Vertraege FOREIGN KEY(K_ID)
REFERENCES Kunde(K_ID),
CONSTRAINT FK_Standort_Vertraege FOREIGN KEY(S_ID)
REFERENCES Standort(S_ID),
CONSTRAINT FK_Mitarbeiter_Vertraege FOREIGN KEY(M_ID)
REFERENCES Mitarbeiter(M_ID),
CONSTRAINT FK_Dienstleistung_Vertraege FOREIGN KEY(D_ID)
REFERENCES Dienstleistung(D_ID),
CONSTRAINT FK_Compliance_Vertraege FOREIGN KEY(C_ID)
REFERENCES Compliance(C_ID);
再次感谢Brian和The Impaler