225

以下に示すように、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_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

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

4

26 に答える 26

248

FOREIGN KEY制約の使用から取得

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

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

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

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

于 2014-02-09T15:18:39.367 に答える
46

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

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

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データが修正されたら、構文を使用して外部キー制約を適用できます。

于 2018-11-01T11:00:31.300 に答える
44

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

に値を挿入するにはOrdrelinje、まずテーブルに値を入力し、それをテーブルOrdreで使用する必要があります。OrdreIDOrderlinje

または、not null 制約を削除して NULL 値を挿入することもできます。

于 2014-02-09T14:32:54.777 に答える
6

私も同じ問題を抱えていました。既存のテーブルでリレーションシップを作成していましたが、関連していると思われる/想定されていた異なる列の値がありました。たとえば、行を持つUSERS列を持つテーブルがありました。次に、行の列を持つ別の子テーブルがありました。次に、MySQl コマンドを実行しますUSERID1,2,3,4,5ORDERSUSERID1,2,3,4,5,6,7ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE;

次のメッセージで拒否されました。

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE)

ORDERS テーブルからデータをエクスポートし、そこからすべてのデータを削除し、コマンドを再実行しました。今回は機能しUSERID、USERS テーブルの対応する s を使用してデータを再挿入しました。

于 2020-09-23T12:11:45.280 に答える
4

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

于 2019-07-26T05:13:47.737 に答える
1

あなたのテーブルは、テーブルのどの列がテーブルのどの列とも一致しなければならないことに応じて、外部キー制約を使用しORDRELINJEてテーブルとリンクされています。ORDERconstraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)Ordre int NOT NULL,ORDRELINJEOrdre int NOT NULL,ORDER

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

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

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

于 2016-07-08T23:23:27.130 に答える
1

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

于 2016-10-24T13:30:53.943 に答える
1

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

子テーブルからすべてのデータを削除してから、外部キーを設定し、その後テーブルにデータを追加/挿入すると機能します。

于 2020-02-14T12:11:22.747 に答える
0

あなたの質問の答えは、主キーと副キーに同じ値を設定する必要があるということです。ありがとう

于 2020-12-11T15:42:57.443 に答える
0

ここでこれを絞り込みます。私のケースは、存在する投稿のいいねを作成しようとしていました。データベースへのコミット中にエラーが発生しました。解決策は、最初に投稿を作成してから、気に入ってもらうことでした。私の理解では、post_id を like テーブルに保存する場合は、最初に posts テーブルをチェックして存在を確認する必要がありました。その方が私にとってより論理的であるため、このようにする方が良いことがわかりました..

于 2019-11-14T09:21:49.360 に答える
0

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

于 2018-08-27T20:12:18.987 に答える
0

実際、この「データベース名.テーブル名に挿入」のように解決しました。そして、「データベース名に挿入」のようなデータを追加しようとすると、うまくいきました。

于 2021-09-17T18:36:40.717 に答える
0

正しいコードであることがわかっていることを実行しようとする前に、外部キーを非 null から null に戻すと、それが機能することがわかりました。Mysql ワークベンチを使用していたことが役に立ちました。また、設定SET FOREIGN_KEY_CHECKS=0; してから =1; に戻す必要がありました。終了後。

于 2021-11-12T22:01:58.557 に答える