【MySQL】外部キー制約を持っているテーブルのデータを削除する時は...


結論:SET FOREIGN_KEY_CHECKS = 0を使って制約を一時的に解除する

こんにちは!スージーです

mysqlで外部キー制約を持つテーブルのデータを削除する必要がある時に毎回調べている気がしたので備忘録として書き留めておきます

参考

railsガイド
MySQL 5.6 リファレンスマニュアル

モデルの関連付け

railsを使っているのでrailsで説明します

# item
# 商品を管理するモデル
create_table "items", charset: "utf8mb4", force: :cascade do |t|
    t.string "item_name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
end

# item_detail
# 商品の詳細を管理するモデル
create_table "item_details", charset: "utf8mb4", force: :cascade do |t|
    t.bigint "item_id" <=  これが外部キー
    t.integer "item_price"
    t.string "description"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
end

# item_detail
class CreateItemDetails < ActiveRecord::Migration[6.1]
  def change
    create_table :item_details do |t|
      t.references :item, foreign_key: { to_table: :items } <= これが外部キー制約
      t.integer "item_price"
      t.string "description"

      t.timestamps
    end
  end
end

itemテーブルのデータを削除する

開発中に色々データを加工したり、削除したりする事があると思いますが、一回テーブルのデータをtruncateしようかなーと思ったら怒られた

mysql > truncate table items;
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`test_item_development`.`item_details`, CONSTRAINT `fk_rails_30c7a965d1` FOREIGN KEY (`item_id`) REFERENCES `test_item_development`.`items` (`id`))

こんな時、開発環境であれば何も考えず以下を実行してtruncateさせちゃいます

mysql > set foreign_key_checks = 0;
mysql > truncate table items;
=> query ok・・・・
mysql > set foreign_key_checks = 1;

set foreign_key_checks = 1;で元に戻しましょう

おわり