PR

MySQL Error Code: 1451 外部キー制約を一時的に無効にしてデータを操作する

スポンサーリンク
この記事は約3分で読めます。

Error Code:1451外部キー制約が失敗しました

 

データ更新に以下のSQLを実行しようとすると

delete
from
  products
where
  id not in(
     select 
       product_id
     from
       order_details
     group by
       product_id   
  );

 

次のようなエラーがでました。

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`mydb`.`products_categories`, CONSTRAINT `fk_products_categories_products1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`))

 

これを翻訳すると

「外部キー制約が失敗しました( `mydb`.products_categories`、CONSTRAINT` fk_products_categories_products1`)FOREIGN KEY( `product_id`)REFERENCES` products`( `id`))」

という内容のもので、親行を削除または更新できない。(外部キー)制約に失敗するというもの

 

当初は外部キーを調べて実行できる方法がないか調べましたがかなりはまってしまったので、気を取り直し、

違う観点から調べてみると外部キー制約を無効にする方法がありましたので早々実行してみました。

参考にさせて頂いたサイト

【MySQL】一時的に外部キー制約を無効にする - プログラムは、用いる言葉の選択で決まる
下記のコマンドで無効化し、 SET FOREIGN_KEY_CHECKS=0; 必要な処理が終了したら、 SET FOREIGN_KEY_CHECKS=1; これで元に戻す。

ありがとうございました(#^.^#)

 

外部キー制約を一時的に無効にする

 

動作確認:
MySQL8.0
MySQLWorkbench8.0

 

 

外部キー制約を無効にする

SET FOREIGN_KEY_CHECKS = 0

 

外部キーを無効して以下のように実行すると

delete
from
  products
where
  id not in(
     select 
       product_id
     from
       order_details
     group by
       product_id   
  );

これまたエラー
今度は、1046エラーで データベースが上手く呼び込めてませんでした。
これを以下のように一列に記述し直すと

delete from products where id not in( select product_id from order_details group by product_id );

無事成功!

productテーブルから一度も売り上げのなかったデータが削除されました。

外部キーを無効にしている間Result Gridでデータは表示されますが以下のように文字が重なっていても重なり幅の調整は効きません。

データの操作が終わったら元に戻しましょう

 

外部キー制約を有効にする

SET FOREIGN_KEY_CHECKS = 1

 

にほんブログ村 IT技術ブログへ

コメント

タイトルとURLをコピーしました