web-dev-qa-db-ja.com

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

以下に示すように、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。子行を追加または更新できません:外部キー制約が失敗しました(srdjank.Ordrelinje、CONSTRAINT Ordrelinje_fk FOREIGN KEY(Ordre)参照OrdreOrdreID))

このトピックに関する他の記事を見たことがありますが、運は悪くありません。私は何かを監督していますか、または何をすべきかのアイデアですか?

88
user3289677

からの引用外部キー制約の使用

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

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

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

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

126
Rahul

Ordreテーブルにはinsertコマンドで指定された参照順序IDがないため、この制約チェックを受けています。

Ordrelinjeに値を挿入するには、まずordreテーブルに値を入力し、orderlinjeテーブルに同じordreIDを使用する必要があります。

または、NOT NULL制約を削除してその中にNULL値を挿入することもできます。

27
Ankit Bansal

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

14
Humphrey

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

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

これで、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構文を使用して外部キー制約を適用できます。

10
Madhur Bhaiya

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

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

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

1)セッション用(推奨)

SET FOREIGN_KEY_CHECKS=0;

2)グローバルに

SET GLOBAL FOREIGN_KEY_CHECKS=0;
6
Mr-Faizan

外部キーテーブルの値は、関連するプライマリキーテーブルに所有されていないため、最初にすべてのデータを削除するか、プライマリキーにある値に従って外部キーテーブルの値を調整する必要があります

1

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

外部キー内のデータの説明

1
mamal

外部キー属性値を挿入するときは、まず親リレーションの主キー属性値だけでなく属性タイプも検証します。親リレーションの値が一致する場合は、子属性値を簡単に挿入/更新できます。

1
ashok

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

0

ORDRELINJEテーブルは、テーブルORDEROrdre int NOT NULL,列がORDRELINJEテーブルのOrdre int NOT NULL,列と一致する必要がある外部キー制約constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)を使用して、ORDERテーブルとリンクされます。

ここで起こっているのは、ORDRELINJEテーブルに新しい行を挿入するとき、fk制約Ordrelinje_fkに従って、ORDERが存在するかどうか、およびOrde​​rIdと一致しない場合にOrdreIDテーブルをチェックしていることです。外部キー違反に対する苦情。これが、このエラーが発生する理由です。

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

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

0
Saket Choubey

これは、最初にParentテーブルにそれぞれのレコードを挿入し、次にChildテーブルのそれぞれの列にレコードを挿入することで解決できます。列のデータ型とサイズも確認してください。エンジンと照合順序も同じでなければなりません、それは親テーブルの列と同じでなければなりません。これを試して!これが私が解決した方法です。間違っていたら私を直してください。

0
frz