两列的外键引用

时间:2016-06-21 06:46:39

标签: sql sql-server database reference foreign-keys

我需要为我的文章表设置两个不同列的两个外键引用。 他们两个都必须引用我的材料表的同一列。 但如果我尝试创建第二个,我得到以下错误:

  

Meldung 1785,Ebene 16,Status 0,Zeile 3

     

DasEinführenderFOREIGN KEY-Einschränkung'FK_db00_02_Artikelstamm_WST_db08_01_Werkstoffe_Bezeichnung'fürdiedb00_02_Artikelstamm-Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen。 Geben Sie ON删除没有行动或更新行动a,oderändernSieandere FOREIGN KEY-Einschränkungen。

     

为db00_02_Artikelstamm表引入FOREIGN KEY约束'FK_db00_02_Artikelstamm_WST_db08_01_Werkstoffe_Bezeichnung'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

我尝试使用此SQL代码创建它们:

-- Fremdschlüssel db00_02_Artikelstamm.WST -> db08_Werkstoffe.Bezeichnung
-- FK_db00_02_Artikelstamm_WST_db08_Werkstoffe_Bezeichnung
ALTER TABLE [dbo].[db00_02_Artikelstamm] WITH CHECK
ADD CONSTRAINT [FK_db00_02_Artikelstamm_WST_db08_Werkstoffe_Bezeichnung] FOREIGN KEY ([WST])
    REFERENCES [dbo].[db08_Werkstoffe] ([Bezeichnung]) ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[db00_02_Artikelstamm] CHECK CONSTRAINT [FK_db00_02_Artikelstamm_WST_db08_Werkstoffe_Bezeichnung]
GO

-- Fremdschlüssel db00_02_Artikelstamm.WSTgroup -> db08_Werkstoffe.Bezeichnung
-- FK_db00_02_Artikelstamm_WSTgroup_db08_Werkstoffe_Bezeichnung
ALTER TABLE [dbo].[db00_02_Artikelstamm] WITH CHECK
ADD CONSTRAINT [FK_db00_02_Artikelstamm_WSTgroup_db08_Werkstoffe_Bezeichnung] FOREIGN KEY ([WSTgroup])
    REFERENCES [dbo].[db08_Werkstoffe] ([Bezeichnung]) ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[db00_02_Artikelstamm] CHECK CONSTRAINT [FK_db00_02_Artikelstamm_WSTgroup_db08_Werkstoffe_Bezeichnung]
GO

我需要的是:

  • 更改材料表中材料的名称会自动更新文章表格中的材料
  • 更改商品表中的材料不会更改材料表中材料的名称
  • 只有新材料位于材料表
  • 中时才能更改商品表
  • 当文章
  • 使用此材料时,我不应该删除材料

我使用MS SQL Server。

我希望我能清楚地解释清楚,有人可以帮助我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

也许您应该使用univoque id作为引用,然后避免“on update cascade”,因为在这种情况下,您可以修改文章的名称,而无需担心对“childs”表的更改传播。 通过这种方式,已经暗示了关于物品表中材料参考变化的约束。

暂停删除约束可以在材料表上声明,其中包含“ON DELETE NO ACTION”



评论后 更新..

如上所述,如果你有一个manteinance和遗留代码的问题,我认为你已经实现了一些软件解决方案,否则我认为最好的解决方案,如果你的“材料”表的引用没有传播到许多其他表,它是备份所有必须修改的表,将新主键添加到物料表中当前唯一的物料名称(如果尚未存在),然后删除指向物料表中物料表的外键,然后更新每篇文章的fk_field中的值,其中每个材质的主要对应于fk_field包含的当前名称,然后添加新的外键。