【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;
で元に戻しましょう
おわり
Author And Source
この問題について(【MySQL】外部キー制約を持っているテーブルのデータを削除する時は...), 我々は、より多くの情報をここで見つけました https://qiita.com/suzy1031/items/24cd8d6bd5734dd13c2e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .