1
1

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 3 years have passed since last update.

外部キーが原因でロールバックできない Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails

Posted at

##関係性

ツイートに対してコメントができるようにしています

tweet.rb

has_many :comments,dependent: :destroy

comment.rb

belongs_to :tweet

##エラー

ツイートのマイグレーションファイルをロールバックしようとするとエラーが発生

ActiveRecord::StatementInvalid: Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails: DROP TABLE `tweets`

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails

##原因

####外部キーの参照整合性が原因
外部キー(FOREIGN KEY)とは、関連したテーブル間を結ぶために設定する列のことで、データの整合性をデータベースに保証させるために利用します。

今回でいうと、もしツイートのマイグレーションをロールバックした場合、Tweetモデル自体が無くなってしまうので、コメントがどのツイートに対してのコメントなのか判断ができなくなってしまいます。

#####commentsテーブル

tweetsテーブルに保存されている、id1のツイートに対してのコメントという意味です。
Tweetモデルが削除されてしまうと、tweet_idって何?ってなってしまいます。
なので上記のエラーが発生してしまいます。

id user_id tweet_id text
1 1 1 hello

##対応
先にコメントのマイグレーションファイルをロールバックする。
そうすればツイートのマイグレーションファイルがロールバックできる。

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?