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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

849閲覧

Ruby on Railsで「rails db:migrate」を実行したが、テーブルが作成されない

NakayaKousuke

総合スコア9

MySQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/23 02:00

Ruby on Railsで「rails db:migrate」を実行したが、下記のエラーが出て、テーブルが作成されないです。

エラーコード

terminal

1rails aborted! 2StandardError: An error has occurred, all later migrations canceled: 3 4Mysql2::Error: Cannot add foreign key constraint: CREATE TABLE `items` (`id` int AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL, `description` text NOT NULL, `brand` varchar(255), `condition` varchar(255) NOT NULL, `delivery_fee` varchar(255) NOT NULL, `delivery_regions` varchar(255) NOT NULL, `shipping_schedule` varchar(255) NOT NULL, `price` int NOT NULL, `user_id` int, `category_id` int NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, INDEX `index_items_on_user_id` (`user_id`), INDEX `index_items_on_category_id` (`category_id`), CONSTRAINT `fk_rails_89fb86dc8b` 5FOREIGN KEY (`category_id`) 6 REFERENCES `categories` (`id`) 7) ENGINE=InnoDB 8/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/db/migrate/20200622134903_create_items.rb:3:in `change' 9/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `require' 10/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `<top (required)>' 11/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/spring:15:in `<top (required)>' 12bin/rails:3:in `load' 13bin/rails:3:in `<main>' 14 15Caused by: 16ActiveRecord::StatementInvalid: Mysql2::Error: Cannot add foreign key constraint: CREATE TABLE `items` (`id` int AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL, `description` text NOT NULL, `brand` varchar(255), `condition` varchar(255) NOT NULL, `delivery_fee` varchar(255) NOT NULL, `delivery_regions` varchar(255) NOT NULL, `shipping_schedule` varchar(255) NOT NULL, `price` int NOT NULL, `user_id` int, `category_id` int NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, INDEX `index_items_on_user_id` (`user_id`), INDEX `index_items_on_category_id` (`category_id`), CONSTRAINT `fk_rails_89fb86dc8b` 17FOREIGN KEY (`category_id`) 18 REFERENCES `categories` (`id`) 19) ENGINE=InnoDB 20/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/db/migrate/20200622134903_create_items.rb:3:in `change' 21/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `require' 22/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `<top (required)>' 23/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/spring:15:in `<top (required)>' 24bin/rails:3:in `load' 25bin/rails:3:in `<main>' 26 27Caused by: 28Mysql2::Error: Cannot add foreign key constraint 29/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/db/migrate/20200622134903_create_items.rb:3:in `change' 30/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `require' 31/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/rails:9:in `<top (required)>' 32/Users/nakaya-kousuke/Documents/GitHub/fleamarket_sample_72a/bin/spring:15:in `<top (required)>' 33bin/rails:3:in `load' 34bin/rails:3:in `<main>' 35Tasks: TOP => db:migrate 36(See full trace by running task with --trace)

マイグレーションファイル

マイグレーションファイルには下記のように記述しています。
・itemsテーブル
・imagesテーブル
・categoriesテーブル

db/migrate/20200622134903_create_items.rb class CreateItems < ActiveRecord::Migration[5.0] def change create_table :items do |t| t.string :name, null: false t.text :description, null: false t.string :brand t.string :condition, null: false t.string :delivery_fee, null: false t.string :delivery_regions, null: false t.string :shipping_schedule, null: false t.integer :price, null: false t.references :user t.references :category, null: false, foreign_key: true t.timestamps end end end
db/migrate/20200622145144_create_images.rb class CreateImages < ActiveRecord::Migration[5.0] def change create_table :images do |t| t.references :item, null: false, foreign_key: true t.string :image_url, null: false t.timestamps end end end
db/migrate/20200623014536_create_categories.rb class CreateCategories < ActiveRecord::Migration[5.0] def change create_table :categories do |t| t.string :name, null: false t.string :ancestry t.timestamps end end end

私の考えた仮説

■仮説1
StandardErrorを調べてみると、「通常のプログラムで発生する可能性の高い例外クラスを束ねるためのクラスです。」と書かれていました。

※参考サイト
https://chinatz.hatenablog.com/entry/2018/08/02/230222
https://randd.kwappa.net/2011/02/07/250/

この例外クラスというものを初めて聞いて調べていますが、いまいち理解できないです。。。
StandardErrorを解決したらいいのか?

■仮説2
Mysql2::Error:の部分を読んでみると、
「Mysql2::Error: Cannot add foreign key constraint」と書いてあり、
外部キー制約を追加できていないようです。

この外部キー制約の記述方法が間違っているのか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

CREATE TABLEされる順序はどうなっていますか?
外部参照されるテーブル(親テーブル)は先にCREATE TABLEされていなければ、外部キーは設定できません。

投稿2020/06/23 02:19

Orlofsky

総合スコア16415

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

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

NakayaKousuke

2020/06/23 10:43

Orlofskyさん、回答ありがとうございます。 親テーブルを先に作成しなければならないとのことでしたので、 categoriesテーブル  ↓ itemsテーブル(※カラムの記述はコメントアウトしました)  ↓ imagesテーブル(※カラムの記述はコメントアウトしました) 以上の順番で、rails db:migrateを実行しました。 そうしましたら、3つ全てのテーブルを作成することができました。 そのあとにitemsテーブルとimagesテーブルのコメントアウトしていた記述を元に戻して、再度rails db:migrateを実行したのですが、カラムが反映されない状況になってしまいました。。。 こちらはもうrails db:migrateのコマンドではカラムを追加することはできないのでしょうか?
NakayaKousuke

2020/06/23 12:13

Orlofskyさん、テーブル作成できて、カラムも追加することができました! itemsテーブルとimagesテーブルをrails g modelコマンドで削除して、 親テーブルの順序でひとつずつ作成したら、解決しました! 次回からテーブル作成するときは、外部キーを見ながら、順序よく作成するように心掛けます! ありがとうございました!
Orlofsky

2020/06/23 12:36

外部キーというのは親テーブルと小テーブルがあって、親テーブルに存在しないキーを小テーブルに登録させない機能です。ですから、テーブルの定義も親テーブルが先、データのINSERTも親テーブルが先です。 今は人を育てるのに時間も費用もかけたくない、だけど優秀な人材は欲しい。それも安く使いたい、ってブラックな会社が多くて悲しいです。ちゃんと教育に時間と費用をかけて人材を育てるのが会社社会的な使命のはずなんですが。
NakayaKousuke

2020/06/24 04:09

Orlofskyさん、返信ありがとうございます。 私はいまプログラミングスクールに通っていて、学習4ヶ月目なんです。。 スクールの最終課題をいま取り組んでおり、まだ理解ができていないことだらけなので、 このような基礎の部分も質問してしまっています。。。 Orlofskyさんのような方から回答もらえて、非常に助かっています。 一人前のエンジニアになれるように頑張りますので、宜しくお願いします! (Orlofskyさんのように教える立場にもなりたいです!)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問