MENU

mysqlで外部キー制約を持っているテーブルのデータを削除する

記事作成から1年以上経過しています。
内容が古い可能性があります。

今日は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;で元に戻しましょう

おわり

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ブライダル業界 → 2021年9月 miracleave に転職
未熟者ですが、よろしくお願いいたします!
甘いもの大好きすぎる。。

目次