1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsで依存関係にあるテーブルを削除する方法

Posted at

はじめに

テーブル関係を削除してスッキリさせようと思ったところ、関連付けのおかげで少し手間取ったので記事にまとめます。

目次

  1. テーブルを削除する
  2. 依存関係がある場合
  3. 依存関係がある場合のテーブルを削除してみる
  4. 参考文献

テーブルを削除する

テーブルを削除するときの手順として私は以下のように行います。

① モデル削除
rails destroy model モデル名

② 削除用のマイグレーションファイルを作成
rails generate migration 自分でつけるmigrationファイルの名前

③ drop_tableで削除したいテーブル名を書く
 作成したmigrationファイルに記載

class 自分で作成したファイルの名前が入る < ActiveRecord::Migration[6.0]
  def change
    drop_table :hoges   # hogesテーブルを削除する場合
  end
end

 
④ migrateを実行して削除

rails db:migratre

依存関係がある場合

いつもなら最初の方法で問題がないはずなのですが、依存関係がある場合だと下記のようなエラーが出ます。


DROP TABLE products;

NOTICE:  constraint orders_product_no_fkey on table orders depends on table products
ERROR:  cannot drop table products because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

公式サイトによると

データベース構造全体の整合性を保つため、PostgreSQLは、他のオブジェクトと依存関係にあるオブジェクトの削除を許可しません。 例えば、項5.3.5で作成したproductsテーブルを削除しようとしても、ordersテーブルがこのテーブルに依存しているので、以下のようなエラーメッセージが現れます。

つまり関連付けを行なっているためdrop_tableを実行できないという事ですね。
その後の文章では次のように続きます。

エラーメッセージには役に立つヒントが含まれています。 以下のようにすると、依存する全てのオブジェクトを1つずつ削除する手間を省けます。
DROP TABLE products CASCADE;
これで全ての依存オブジェクトが削除されます。 この場合、ordersテーブルは削除されずに外部キー制約のみが削除されます。

なるほど! DROP TABLE products CASCADE;を使用すればいいか!早速やってみよう!

依存関係がある場合のテーブルを削除してみる

Railsではrails dbまたは rails dbconsoleでSQLを操作できるようになるので早速やってみます。パスワードを求められるので自身で設定したパスワードで入ってください

rails dbを実行

DROP TABLE 削除したテーブル名 CASCADE;を実行

以上でなんとか削除できました!よかった!

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?