今日はmysqlで外部キー制約を持つテーブルのデータを削除する必要がある時に毎回調べている気がしたので備忘録として書き留めておきます。
目次
結論
SET FOREIGN_KEY_CHECKS = 0
を使って制約を一時的に解除する。
参考
railsガイド
[MySQL 5.6 リファレンスマニュアル](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;
で元に戻しましょう
おわり