INSERT INTO コマンドで外部キー エラー メッセージが表示された場合、新しいデータを挿入するために使用できる MYSQL のコマンドはどれですか?
3 に答える
あなたはそうしない。Insert
データベースの要件を満たす方法でデータやステートメントを作成します。
重複キーエラーを処理する必要INSERT ... ON DUPLICATE KEY UPDATE
がありますが、外部キーエラー用のエラーはありません。
重複キーを処理する場合は、http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htmlを参照してください。
どの「外部キー エラー メッセージ」を受け取ったかを正確に指定していただけると助かります。ただし、それが最も可能性の高い候補の 1 つであると仮定すると、次のようになります。
- エラー 1216:子行を追加または更新できません: 外部キー制約が失敗します。また
- エラー 1452:子行を追加または更新できません: 外部キー制約が失敗しました (%s)。
これらのメッセージはどちらも同じことを示しています。外部キーを表す列に、親テーブルに存在しないレコードを参照する値が含まれるように、レコードを挿入 (または更新) しようとしています。
以下の例では、テーブルCustomerID
に存在しない で注文を挿入/更新しようとすると、エラー 1216 が発生します。Customers
CREATE TABLE Customers (
CustomerID SERIAL
) Engine=InnoDB;
CREATE TABLE Orders (
OrderID SERIAL,
CustomerID BIGINT UNSIGNED NOT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
);
INSERT INTO Customers
(CustomerID)
VALUES
(100),
(200)
;
INSERT INTO Orders
(OrderID, CustomerID)
VALUES
(1, 200), -- okay, as CustomerID 200 exists
(2, 300) -- fails, as CustomerID 300 does not exist
;
他の人が示唆しているように、この問題に対する最善の解決策は、外部キー制約を満たすためにデータベース アクティビティを変更することです。
別の方法として、データベースから外部キー制約を削除することもできます (ただし、RDBMS は参照整合性を強制しません。これは通常、実行したいことです)。または、MySQL の参照整合性チェックを一時的に無効にすることもできますが、これは通常、制約違反につながる可能性のある順序で参照整合性を持つことがわかっているデータをロードする場合にのみ行われます。一般的なアプリケーションでの使用は推奨されません。