以下に示すように、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
、CONSTRAINTOrdrelinje_fk
FOREIGN KEY(Ordre
)参照Ordre
(OrdreID
))
このトピックに関する他の記事を見たことがありますが、運は悪くありません。私は何かを監督していますか、または何をすべきかのアイデアですか?
外部キー関係には、中央データ値を保持する親テーブルと、同じ値を持ちその親を指す子テーブルが含まれます。子表にFOREIGN KEY句が指定されています。
親テーブルに一致する候補キー値がない場合、子テーブルに外部キー値を作成しようとするINSERTまたはUPDATE操作はすべて拒否されます。
したがって、エラーError Code: 1452. Cannot add or update a child row: a foreign key constraint fails
は、基本的に、一致する行(OrderID)がOrdrelinje
テーブルに存在しない行をOrdre
テーブルに追加しようとしていることを意味します。
最初に行をOrdre
テーブルに挿入する必要があります。
Ordreテーブルにはinsertコマンドで指定された参照順序IDがないため、この制約チェックを受けています。
Ordrelinjeに値を挿入するには、まずordreテーブルに値を入力し、orderlinjeテーブルに同じordreIDを使用する必要があります。
または、NOT NULL制約を削除してその中にNULL値を挿入することもできます。
親テーブルの主キーに対応する外部キーの値がない子テーブルのデータを削除する必要があります。または、子テーブルからすべてのデータを削除してから、親テーブルの主キーと同じ外部キー値を持つ新しいデータを挿入します。 。それはうまくいくはずです。こちらも youtubeビデオ
このエラーは通常、子テーブルの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つ(またはそれ以上)を行うことができます。
null
に設定する必要があるかもしれません。データが修正されたら、ALTER TABLE
構文を使用して外部キー制約を適用できます。
問題は、外部キー制約にあります。デフォルトで(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;
外部キーテーブルの値は、関連するプライマリキーテーブルに所有されていないため、最初にすべてのデータを削除するか、プライマリキーにある値に従って外部キーテーブルの値を調整する必要があります
pRIMARY TABLEのREFERENCES KEYからCHILD TABLEのFOREIGN KEYにデータを追加する必要があります。
外部キーにランダムデータを追加しないことを意味します●アクセス可能な主キーのデータのみを使用します
外部キー属性値を挿入するときは、まず親リレーションの主キー属性値だけでなく属性タイプも検証します。親リレーションの値が一致する場合は、子属性値を簡単に挿入/更新できます。
各テーブル(外部キーが指し示すもの)に最低1つのrawを挿入する必要があります。その後、外部キーの値を挿入または更新できます。
ORDRELINJE
テーブルは、テーブルORDER
のOrdre int NOT NULL,
列がORDRELINJE
テーブルのOrdre int NOT NULL,
列と一致する必要がある外部キー制約constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
を使用して、ORDER
テーブルとリンクされます。
ここで起こっているのは、ORDRELINJE
テーブルに新しい行を挿入するとき、fk制約Ordrelinje_fk
に従って、ORDER
が存在するかどうか、およびOrderIdと一致しない場合にOrdreID
テーブルをチェックしていることです。外部キー違反に対する苦情。これが、このエラーが発生する理由です。
外部キーは、両方のテーブルをリンクするために任意のテーブルで使用する他のテーブルの主キーです。このキーは、テーブルの作成中に指定した外部キー制約によってバインドされます。データに対する操作は、この制約に違反してはなりません。この制約に違反すると、このようなエラーが発生する場合があります。
私がそれを明らかにしたことを願っています。
これは、最初にParentテーブルにそれぞれのレコードを挿入し、次にChildテーブルのそれぞれの列にレコードを挿入することで解決できます。列のデータ型とサイズも確認してください。エンジンと照合順序も同じでなければなりません、それは親テーブルの列と同じでなければなりません。これを試して!これが私が解決した方法です。間違っていたら私を直してください。