質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

1289閲覧

MySQL・rails 外部キーが追加できない理由について

otyaotya

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2021/11/03 07:28

ご覧いただきありがとうございます。
現在インスタのようなrailsアプリを作成しており今回photoモデルを追加しようとしたところ
mysqlでエラーが出てきました。エラー自体はすでに解消ずみだったのですが全体の流れが
イマイチ理解できなかったのでどなたかお分かりになる方ご教授いただけましたら幸いです。

エラー内容

Mysql2::Error: Cannot add foreign key constraint

mysql> SHOW ENGINE INNODB STATUS\Gで詳しいエラー内容を確認

2021-11-02 07:28:38 0x7f45a84e4700 Error in foreign key constraint of table app_development/photos: FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ): Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint. Note that the internal storage type of ENUM and SET changed in tables created with >= InnoDB-4.1.12, and such columns in old tables cannot be referenced by such columns in new tables. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html for correct foreign key definition.

postのデータベース中身

+------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | content | text | YES | | NULL | | | user_id | int(11) | NO | MUL | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+----------+------+-----+---------+----------------+ 5 rows in set (0.01 sec)

解決方法

以下記事を参考にしました。
https://stackoverflow.com/questions/42422894/cannot-add-foreign-key-constraint-error-when-running-rails-migration

foreign_keyをfalseにする --> t.references :post, foreign_key: false

データベースをリセットします --> rails db:migrate:reset,

foreign_keyをtrueに戻します --> t.references :post, foreign_key: true

DBを移行します --> rails db:migrate

これで確かにエラーは解消したのですが正直何が起こったのかよくわからなかったため
お分かりになる方、どなたかこの一連の流れを解説等していただけましたら大変助かります。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/42422894/cannot-add-foreign-key-constraint-error-when-running-rails-migration

問題ある時のpostとphotoテーブルのschema貼ってないので、こちらで確認できないですが、

stackoverflowで書いた通り、エラーなる時のphotoテーブルのpost_idとpostsテーブルのidのtypeが違うようです。

原因はrails migrateのバージョンが違うかもしれないです。

なので、migrateファイルからDBを作り直すことでtypeが同じになり、解決したと思います。

migrateのバージョン違いによる挙動の違いを防げには、migrateファイルへバージョン指定することで防げます。

ruby

1# バージョンを5.0へ指定する 2class CreatePosts < ActiveRecord::Migration[5.0] 3 def change 4 create_table :posts do |t| 5 end 6 end 7end

投稿2021/11/03 08:03

heroyct

総合スコア434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otyaotya

2021/11/11 09:09

heroyct様 教えていただきありがとうございます!またせっかく回答していただいたのに気づくのが遅くなってしまい申し訳ございません。 migrateのバージョンによってtypeが変わってくるのですね。。 データにもバージョンによって属性というか種類があるということなのでしょうか。stackoverflowにあった「usersテーブルの列の列タイプはint(11)unsignedでした。」ここの部分をもっと掘り下げて勉強していきたいと思います。また一つ勉強になりました!本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問