web-dev-qa-db-ja.com

ALTER TABLEステートメントがFOREIGN KEY制約と競合しました

tblDomareテーブルに外部キーを追加しようとしたときに問題が発生しました。私はここで何をしているの?

CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);

CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));

INSERT INTO tblBana (BanNR)
Values (1);

INSERT INTO tblBana (BanNR)
Values (2);

INSERT INTO tblBana (BanNR)
Values (3);

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

エラーメッセージ:

ALTER TABLEステートメントは、外部キー制約 "FK _tblDomare_ PersN__5F7E2DAC"と競合しました。データベース "almu0004"、テーブル "dbo.tblBana"、列 'BanNR'で競合が発生しました。

152
user3162932

tblDomare.PersNRからtblBana.BanNRへの外部キーを作成しようとしましたが、tblDomare.PersNRの値がtblBana.BanNRのいずれの値とも一致しなかったために発生しました。参照整合性に違反する関係を作成することはできません。

284
Smutje

この問い合わせは私にとって非常に役に立ちました。一致しないすべての値が表示されます

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
28
dantey89

ALTER TABLE tablename WITH NOCHECK ...を使用して外部キーを作成できます。これにより、外部キーに違反するデータが許可されます。

FKを追加するための "ALTER TABLE tablename WITH NOCHECK ..."オプション - この解決策は私のために働きました。

24
Ankita Biswas

この解決策を試してください。

テーブルに関連付けられた値が主キーテーブルとして使用するテーブルに存在しないデータ項目があります。テーブルを空にするか、2番目のテーブルに関連する値を追加してください。

17
PatsonLeaner

テーブルに外部キーを追加する前に、次の操作を行います。

  1. テーブルが空であること、または列データが一致することを確認してください。
  2. Nullでないことを確認してください。
  3. テーブルに設計や変更が含まれていない場合は、手動で実行してください。

    表1の変更外部キー(列名)の参照表2(列名)の追加

    表1変更列列名属性がNULLではない

10
GirishBabuC

外部キーテーブルの列値は、主キーテーブルの列値と一致している必要があります。 1つの列内の値(外部キーになる予定)が主キーテーブルの列値と異なる2つのテーブル間に外部キー制約を作成しようとすると、メッセージがスローされます。

そのため、主キーテーブルの列に存在する外部キー列の値のみを挿入することを常にお勧めします。

例えば。プライマリテーブルの列の値が1、2、3で、外部キーの列に挿入された値が異なる場合、値は1と3の間にあると想定されるため、クエリは実行されません。

9
sam05

あなたのテーブルからあなたのデータをきれいにして、次にそれらの間の関係を作ります。

6
max

現在のデータをtblDomare.PersNRからDELETEしてみてください。なぜなら、tblDomare.PersNRの値は、tblBana.BanNRのどの値とも一致しなかったからです。

4
Thinker Bell

smutjeがあなたの参照テーブルにないあなたのベース外部キーテーブルの外部キーカラムに値がないことを確かめたので私もこのエラーを持っていた外部キー)も参照テーブルの列にある必要があります)最初に基本外部キーテーブルを空にしてから外部キーを設定するのが適切です。

3
ako

Smutjeは正しいです、そして、チャドヘッジコックは素晴らしい素人の例を提供しました。 Idはそれらのレコードを見つけたり削除したりする方法を提供することでチャドの例を基にしたいと思います。私たちは顧客を親として、注文を子として使用します。 CustomerIdは共通フィールドです。

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

このスレッドを読んでいるなら...あなたは結果を得るでしょう。これらは孤児です。 Order Childから*を選択し、Child.CustomerId = Parent.CustomerIdでParentに結合します。Parent.CustomerIdはnullです。右下の行数に注意してください。

あなたがこれらの行を削除しようとしていることをあなたが必要としている誰でもw/verifyしてください!

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

最初のビットを実行してください。その行数を確認してください=あなたが期待したもの

トランをコミットする

commit tran 

注意してください。誰かのずさんなプログラミングがこの混乱にあなたを導いた。孤児を削除する前に、その理由を確実に理解してください。多分親は元通りになる必要がある。

2
greg

テーブルの行にデータがあるかどうかを確認する必要があります。 "yes"の場合はテーブルを切り捨てるか、それ以外の場合はtblDomare.PersNRからtblBana.BanNRまでとvise-verseで同じ数のデータを持つようにすることができます。

2
adrianex03

テーブル(tbldomare)に入力したデータが、主キーテーブルに割り当てたデータと一致しません。 tbldomareの間に書いて(nocheckを使って)このWordを追加してからコードを実行します。

たとえば、テーブルtbldomarこのデータを入力したとします。

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

そしてforeign keyテーブルを割り当てて、1,2,3だけを受け入れるようにしました。

2つの解決策があります。1つはテーブルに入力したデータを削除してからコードを実行することです。もう一つは、この単語を(nocheckで)あなたのテーブル名の間に入れてこのように追加することです

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
2
khadar

データベースを設計しているので、これは私に起こります。メインテーブルのシードを変更したことに気付きました。今度はリレーショナルテーブルにメインテーブルの外部キーがありません。

だから私は両方のテーブルを切り捨てる必要があり、それは今動作します!

2
Willy David Jr

私のシナリオでは、EFを使用して、既存のデータにこの新しい外部キーを作成しようとすると、外部キーを作成した後に誤ってデータを設定(リンクを作成)しようとしました。

修正は、外部キーを作成する前にデータを入力することです。これは、すべてのリンクをチェックして、リンクが実際に有効かどうかを確認するためです。そのため、まだデータを入力していないと機能しない可能性があります。

0
JeromeJ