エラー1452:子行を追加または更新できません:外部キー制約が失敗します


130

以下に示すように、MySQL Workbenchでテーブルを作成しました。

ORDREテーブル:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

PRODUKTテーブル:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

そして、ORDRELINJEテーブル:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

したがって、ORDRELINJEテーブルに値を挿入しようとすると、次のようになります。

エラーコード:1452。子行を追加または更新できません:外部キー制約が失敗しました(srdjankOrdrelinje、CONSTRAINT Ordrelinje_fkFOREIGN KEY(Ordre)REFERENCES OrdreOrdreID))

このトピックに関する他の投稿を見たことがありますが、運はありません。私は何かをするのか、何をすべきかを監督していますか?


回答:


172

FOREIGN KEY制約の使用から取得

外部キー関係には、中央のデータ値を保持する親テーブルと、その親を指す同一の値を持つ子テーブルが含まれます。FOREIGN KEY句が子テーブルで指定されています。

親テーブルに一致する候補キー値がない場合、子テーブルに外部キー値を作成しようとするINSERTまたはUPDATE操作は拒否されます。

だからあなたのエラー Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails基本的にOrdrelinje、一致する行(OrderID)がOrdreテーブルに存在しない行をテーブルに追加しようとしていることを意味します。

まず、行をOrdreテーブルに挿入する必要があります。


または、外部キーを削除してから、データ挿入後に外部キーを追加できますか?
Vamsi Pavan Mahesh 2015

@VamsiPavanMahesh、いや、あなたがそうしたとしても、原因です。キーデータの不一致が発生するため、外部キーの作成は同じ種類のエラーで失敗します。
Rahul

4
簡単に言えば、子に親IDが定義されている場合、これらの親が存在している必要があります。そして、私は自分の構文が間違っていると思いました...それは私を大いに助けました。ありがとう!
wst

2
オプションの関係についてはどうですか?
Hamed Hamedi

40

OrdreテーブルOrdreIDに挿入コマンドで提供された参照がないため、この制約チェックを取得しています。

に値を挿入するにはOrdrelinje、最初にOrdreテーブルに値を入力し、それOrdreIDOrderlinjeます。

または、null以外の制約を削除して、NULL値を挿入できます。


29

親テーブルの主キーに対応する外部キー値がない子テーブルのデータを削除する必要があります。または、子テーブルからすべてのデータを削除してから、親テーブルの主キーと同じ外部キー値を持つ新しいデータを挿入してください。うまくいくはずです。こちらもYouTube動画


1
これは正しいです。ピボットテーブル(CASCADE制約があるテーブル)にデータを挿入する前に、親テーブルにデータを挿入する必要があります。たとえば、最初のテーブル-権限。2番目の表-役割。3番目のテーブル-permission_role; したがって、1つ目の権限テーブルへの挿入、2つ目の役割テーブルへの挿入、最後にpermission_roleテーブルへの挿入を行います。
Deepak Panwar

23

問題はFOREIGN KEY制約にあります。デフォルトでは(SET FOREIGN_KEY_CHECKS = 1)。FOREIGN_KEY_CHECKSオプションは、InnoDBテーブルの外部キー制約をチェックするかどうかを指定します。MySQL-SET FOREIGN_KEY_CHECKS

Queryを実行する前に、外部キーチェックを無効に設定できます。外部キーを無効にする

クエリを実行する前にこれらの行の1つを実行すると、クエリを正常に実行できます。:)

1)セッション(推奨)

SET FOREIGN_KEY_CHECKS=0;

2)グローバルに

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

このエラーは通常、子テーブルの参照フィールドに、参照/候補に存在しない値がいくつかあるために発生します。親テーブルのフィールドフィールドにます。

データがすでに存在する既存のテーブルに外部キー制約を適用するときに、このエラーが発生することがあります。他のいくつかの回答は、子テーブルからデータを完全に削除してから、制約を適用することを提案しています。ただし、子テーブルに作業/本番データがすでにある場合、これはオプションではありません。ほとんどのシナリオでは、子テーブルのデータを更新する必要があります(削除するのではなく)ます。

これLeft Joinで、親テーブルに一致する値を持たない子テーブル内のすべての行を見つけるために利用できます。次のクエリは、一致しない行をフェッチするのに役立ちます。

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

これで、通常、次の手順の1つ(または複数)を実行してデータを修正できます。

  1. 「ビジネスロジック」に基づいて、これらの一致しない値を親テーブルの既存の値で更新/一致させる必要があります。それらを設定する必要がある場合もありnullます。
  2. 値が一致しないこれらの行を削除します。
  3. 子テーブルの一致しない値に対応する、親テーブルに新しい行を追加します。

データを修正したら、ALTER TABLE構文を使用して外部キー制約を適用できます。


テーブルからすべてのデータを削除してから、外部キーを追加しました。追加されました。ありがとう
Sumit Kumar Gupta

4

外部キーテーブルの値が、関連付けられる主キーテーブルで所有されていないため、最初にすべてのデータを削除するか、主キーにある値に従って外部キーテーブルの値を調整する必要があります


3

子テーブルで参照しているすべての値が親テーブルにあるにもかかわらず、この問題が発生していました。問題は、単一の外部キーに複数の子参照を追加できないことでした。言い換えると、同じ外部キーを参照する5行のデータがある場合、MySQLでは最初の行のみをアップロードでき、エラー1452が発生しました。

私にとってうまくいったのは、コード「SET GLOBAL FOREIGN_KEY_CHECKS = 0」を入力することでした。その後、MySQLを閉じて再起動すると、エラーなしですべてのデータをアップロードできました。次に、「SET GLOBAL FOREIGN_KEY_CHECKS = 1」と入力してシス​​テムを通常の状態に戻しましたが、FOREIGN_KEY_CHECKSの機能は完全にはわかりません。お役に立てれば!


これは、@ Mr-Faizanによって投稿された回答ですでに提案されているものではありませんか?そうでない場合は、回答の追加内容を説明してください。
Adrian Mole

2

これは、最初に親テーブルにそれぞれのレコードを挿入してから、子テーブルのそれぞれの列にレコードを挿入することで修正できます。列のデータ型とサイズも確認してください。親テーブルの列と同じである必要があります。エンジンと照合も同じである必要があります。これを試して!これが私の解決方法です。間違っていれば訂正してください。


1

あなたのORDRELINJEテーブルをとリンクされているORDER外部キー制約を使用して、テーブルconstraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)それによればOrdre int NOT NULL,、テーブルの列のORDRELINJEいずれかの一致しなければならないOrdre int NOT NULL,の列をORDERのテーブルを。

ここで起こっているのは、ORDRELINJEテーブルに新しい行を挿入するとき、fk制約に従って、テーブルが存在するかどうかをOrdrelinje_fkチェックし、それがどのOrderIdとも一致しないため、コンパイラーが外部キー違反について文句を言うことです。これが、このエラーが発生する理由です。ORDEROrdreID

外部キーは、他のテーブルの主キーであり、テーブル間のリンクに使用します。このキーは、テーブルの作成時に指定した外部キ​​ー制約によってバインドされます。データに対する操作は、この制約に違反してはなりません。この制約に違反すると、このようなエラーが発生する可能性があります。

私がそれを明らかにしたことを願っています。


1

外部キー属性値を挿入するときは、最初に属性タイプと親リレーションの主キー属性値を確認します。親リレーションの値が一致する場合は、子属性値を簡単に挿入/更新できます。


1

PRIMARY TABLEのREFERENCES KEYからCHILD TABLEのFOREIGN KEYに
データを追加する必要があります。これは、ランダムデータを外部キーに追加しないことを意味します。アクセス可能な主キーのデータを使用するだけです。

外部キーのデータの説明


1

@ Mr-Faizanの回答やその他の回答を読んだ後、これは私を助けてくれました。

「外部キーチェックを有効にする」のチェックを外します

phpMyAdminでクエリを実行します。WorkBenchについては知りませんが、他の回答が役立つ場合があります。


0

各テーブル(外部キーが指すもの)に少なくとも1つのrawを挿入する必要があります。その後、外部キーの値を挿入または更新できます。


0

ここでこれを絞る:私のケースは、存在する投稿のいいね!を作成しようとしていました。データベースへのコミット中にエラーが発生しました。解決策は、まず投稿を作成してから、それを気に入ってもらうことでした。post_idが高評価テーブルに保存されるかどうかの私の理解から、存在を確認するために、最初に投稿テーブルをチェックする必要がありました。私にとってはそのほうが理にかなっているので、この方法で持った方がいいと思いました。


0

あなたが使用している場合は、外部キーを、あなたの列の順序は同じでなければなりませんための挿入

たとえば、あなたが追加している場合(userid, password)には、TABLE1からtable2のから、次に表2の順序は同じである必要があります(userid, password)し、好きではない (password,userid)場所userid外部キー表2table1に


0

この問題は、子テーブルにデータを挿入した後で子テーブルに外部キーを設定したために発生します。

子テーブルからすべてのデータを削除してから外部キーを設定し、後でデータをテーブルに追加/挿入してみてください。


0

いいえを確認してください。子テーブルと一致する親テーブルのレコードと、主キーも外部キー参照と一致する必要があります。これは私にとってはうまくいきます。


-4

100%動作しています...

エラー1452:子行を追加または更新できません:外部キー制約が失敗します...このタイプのエラーが発生した場合:最初にこのテーブルに移動し、設定をチェックします>エンジンが:InnoDBの場合はMyISAMに変更します

(参照の外部制約を削除します)

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