INSERTステートメントがFOREIGN KEY制約と競合しました-SQL Server


225

次のエラーが発生します。手伝っていただけませんか?

メッセージ547、レベル16、状態0、行1
INSERTステートメントは、FOREIGN KEY制約「FK_Sup_Item_Sup_Item_Cat」と競合しました。データベース "dev_bo"、テーブル "dbo.Sup_Item_Cat"で競合が発生しました。ステートメントは終了されました。

コード:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

最後の列client_idがエラーの原因です。に既に存在する値dbo.Sup_Item_Catを、sup_item ..に対応する列に入れようとしましたが、喜びはありません:-(


20
テーブルに一致するカテゴリレコードがないレコードをアイテムテーブルに挿入しようとしましたSup_Item_Cat。それについて言うことは他にあまりありません。
マーティン・スミス

1
つまり、SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'結果を返すと言っているのですか?
Martin Smith

2
また、「最後のクラム "client_id"で競合が発生しています」とも言います。これは、エラーメッセージが意味するものではありません。問題の場所が間違っていると思います。
Martin Smith

回答:


287

テーブルdbo.Sup_Item_Catでは、別のテーブルへの外部キー参照があります。FKが機能する方法は、その列に、参照されるテーブルの主キー列にもない値を持つことはできないということです。

SQL Server Management Studioがある場合は、それを開いてsp_helpdbo.Sup_Item_Cat」を開きます。FKがどの列にあり、どのテーブルのどの列が参照しているかを確認します。不正なデータを挿入しています。

より良い説明が必要な場合はお知らせください!


10
sp_helpコマンドを含めていただきありがとうございます。同様の問題を絞り込むのに役立ちました。
Gaʀʀʏ

確かに-私の場合、プロパティはビューからコントローラーに送り返されていなかったため、常に0でした(これは有効なIDではありませんでしたが、コントローラーはそれを知る方法がありませんでした。)
neminem

1
Alt + F1はsp_helpのショートカットです。futrureリーダーの場合は、テーブルを選択してalt + f1を押します
satsvelke

133

外部キーフィールドに入力しようとすると表示されるエラーメッセージに関して、私自身もこの問題を抱えていました。私は答えを見つけることを期待してこのページに行きました。このページのチェックされた回答は確かに正しいものです。残念ながら、SQLに慣れていない人にとっては、回答が少し不完全であると感じています。私はコードを書くのがかなり上手ですが、SQLクエリはデータベーステーブルを構築するだけでなく、私にとっても初めてです。

チェックされた答えが正しいにもかかわらず:

マイクMが書いた

「FKが機能する方法は、その列に、参照されたテーブルの主キー列にもない値を持つことはできないということです。」

この答えに欠けているのは単純です。

最初に主キーを含むテーブルを作成する必要があります。

別の言い方をすると、

外部キーを含む子テーブルにデータを挿入する前に、主キーを含む親テーブルにデータを挿入する必要があります。

要するに、チュートリアルの多くはこの事実を理解しているように見えるので、自分で試してみて、操作の順序があることに気付いていない場合は、このエラーが発生します。当然、主キーデータを追加した後、子テーブルの外部キーデータは、親テーブルの主キーフィールドに準拠する必要があります。そうでない場合は、このエラーが発生します。

誰かがここまで読んだら。これがチェックされた答えをより明確にするのに役立つことを願っています。この種のことは非常に単純明快であり、本を開くと、投稿される前にこの質問に答えられたと思う人がいることは知っていますが、本当のことは誰もが同じように学ぶわけではありません。


追加したいのですが、クエリのプロファイルを作成するようにしてください。クエリはデータベースに送信する必要があるとは限らないためです。
HLGEM 2014年

20

外部テーブルに存在しない外部キー列に値を持つレコードを挿入しようとしています。

次に例を示します。BooksとAuthorsテーブルがあり、BooksがAuthorsテーブルに外部キー制約を持っている場合に、authorレコードのないbookレコードを挿入しようとします。


16

より明確にするために、ステートメントを投稿する必要があります。だが...

このエラーは、データを挿入するテーブルに、別のテーブルとの外部キー関係があることを意味します。データを挿入する前に、外部キーフィールドの値が他のテーブルに最初に存在している必要あります。


5

問題は、私が見ることができるclient_idにはありません。問題は4列目のsup_item_cat_idにあるようです

私は走るだろう

sp_helpconstraint sup_item

そして、外部キーFK_Sup_Item_Sup_Item_Catに対して返されたconstraint_keys列に注意を払い、どの列が実際の問題であるかを確認しますが、修正しようとしている列ではないことは確かです。'123123'も疑わしいようです。


5

私が見つけたものは、すべてのフィールドが正確に一致する必要があるということでした。

たとえば、「cat dog」を送信することは、「catdog」を送信することと同じではありません。

これをトラブルシューティングするために行ったのは、データを挿入するテーブルからFKコードをスクリプト化し、制約があった(私の場合は2であった)「外部キー」を書き留め、それらの2つのフィールド値が一致することを確認することでした。 FK制約エラーをスローしていたテーブルにあったとおりです。

問題が発生する2つのフィールドを修正したら、人生は良かったです!

より詳しい説明が必要な場合は、お知らせください。


これは本当に役に立ちました!この事実を見落とし、私が抱えていた問題を修正しました!ありがとう
ジョナサンブラウン

4

SQLコードでも同じエラーが発生しました、この解決策は私にとってうまくいきます、


主テーブルのデータを確認してください主キー列に存在しない列値を入力している可能性があります。


3

それはまさにそれが言うことを意味します。ルックアップテーブルのどの値とも一致しないFK制約が設定されている列に値を挿入しようとしています。


2

外部キーが定義されている関係のフィールドを再確認してください。SQL Server Management Studioには、関係を定義するときに選択したいフィールドがなかった可能性があります。これは過去に私を火傷しました。


2
  1. sp_helpconstraintを実行する
  2. 外部キーに対して返されたconstraint_keys列に注意を払います

2

親テーブルのデータがないと問題が発生します。あなたの問題では、「dbo.Sup_Item_Cat」のデータが利用できないことが問題の原因です


1

コードファーストマイグレーションを使用してMVC 5アプリケーションのデータベースを構築したときも、同じ問題が発生しました。私は最終的に、私のconfiguration.csファイルのシードメソッドが問題の原因であることを発見しました。私のシードメソッドは、一致する主キーを持つエントリを作成する前に、外部キーを含むテーブルのテーブルエントリを作成していました。


1

挿入値フィールドに肉眼では分からないタブとスペースが含まれていると、この問題に遭遇しました。Excelで値リストを作成し、コピーしてSQLに貼り付け、クエリを実行してFKフィールドで一致しないものを見つけました。

一致クエリは、FKフィールドにタブとスペースがあることを検出しませんでしたが、INSERTはそれらを認識し、エラーを生成し続けました。

FKフィールドの内容を1つのレコードにコピーし、それを挿入クエリに貼り付けて、もう一度テストしました。そのレコードも失敗したとき、私はデータを詳しく調べ、最終的にタブ/スペースを検出しました。

削除したタブやスペースを削除すると、問題は解決しました。これが誰かを助けることを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.