2016-06-21 25 views
0

2つの異なる列の2つの外部キー参照を記事テーブルに設定する必要があります。 両方とも自分の材料表の同じ列を参照する必要があります。 しかし、私は次のエラーを得た二を作成しようとします。2つの列の外部キー参照

Meldung 1785, Ebene 16, Status 0, Zeile 3

Das Einführen der FOREIGN KEY-Einschränkung 'FK_db00_02_Artikelstamm_WST_db08_01_Werkstoffe_Bezeichnung' für die db00_02_Artikelstamm-Tabelle kann Schleifen oder mehrere Kaskadepfade verursachen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen.

The introduction of the FOREIGN KEY constraint 'FK_db00_02_Artikelstamm_WST_db08_01_Werkstoffe_Bezeichnung' for db00_02_Artikelstamm table can cause loops or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints

私は、この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を使用しています。

私はそれをはっきりと説明することができ、誰かが私を助けてくれることを願っています。

ありがとうございます!

+0

例外メッセージ言語(私はドイツ語を推測しています)を読んでいない私たちのために、英語に翻訳してください。 –

答えて

0

このような場合、「子」テーブルへの変更の伝播を心配することなく、記事の名前を変更できるので、ユニボイックIDを参照として使用し、「更新時カスケード」を避ける必要があります。 このように、商品テーブルの品目参照の変更に関する制約が既に暗示されています。あなたが持っている場合

停止、削除制約が句で材料テーブルの上にdeclaratedすることができますが、コメントの後



アップデート "ON NO ACTIONを削除しない" ..

としては、言いましたmanteinanceとレガシーコードの問題私はあなたが "材料"テーブルの参照が多くの他のテーブルに広がっていない場合、あなたがいくつかのソフトウェアソリューションを実装していると思います。変更する必要があります。現在のユニークな物質名とは異なる新しいプライマリキー(存在しない場合)、アーティクルテーブルのマテリアルテーブルを指す外部キーを削除し、各アーティクルのfk_fieldの値をプライマリで更新するfk_fieldに含まれる現在の名前の値に対応する各マテリアルの新しい外部キーを追加します。

+0

材料表の "Bezeichnung"欄はUNIQUEです。しかし、誰かが名前を変更した場合、それも記事テーブルで更新する必要があります。 – CSharper

+0

あなたの要件を行うには、情報を指さない参照を実装する必要があります。参照は抽象的でなければなりません。常にdbのその行を指し示しますが、その行の収集された情報を指し示すわけではありません。これはベストプラクティスですが、正確なデータベース作成の必要条件です –

+0

私はあなたが何を意味するのかは知っていますが、システムが既に稼働していて、この新しい制約をこの実行システムに追加する必要があるこのような変更。私はそれを説明するようにそれを行う方法はありますか? – CSharper

関連する問題