LoginSignup
6
3

More than 5 years have passed since last update.

Rails4.0でMySQL5.7を使ってrake db:createするとエラーが出た

Last updated at Posted at 2017-05-14

概要

rails4.0でMySQL5.7.3以上と繋いで、db:createした場合、

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; 

のエラーが出るため、その解決策を提示する。

実行環境

バージョン Extra
CentOS 6.9 VirtualBox経由でssh接続
Rails 4.0.13 dot installのRailsの教材がRails4.0を使っていたためv4.0の最新版にした
MySQL 5.7.18
Ruby 2.3.1 こちらも教材に合わせた。rbenvで管理。
Bundler 1.14.6
mysql2 0.4.6 バージョン指定せず、最新版。

エラー詳細

上記の環境で、

$ rails generate scaffold User nickname:string age:integer

として、

$ rake db:migrate

すると、

== 20170514132649 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `nickname` varchar(255), `age` int(11), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB

/home/vagrant/myapp/db/migrate/20170514132649_create_users.rb:3:in `change'
ActiveRecord::StatementInvalid: Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `nickname` varchar(255), `age` int(11), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB

と弾かれる。

原因

ActiveRecord周りのバグ。

/usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-4.0.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rbを見ると、

abstract_mysql_adapter.rb(excerpt)

139       NATIVE_DATABASE_TYPES = {
140         :primary_key => "int(11) DEFAULT NULL auto_increment     PRIMARY KEY”,

と、primary keyのデフォルトがNULLになっている。

上記の公式サイトによると、
古いバージョンのMySQL(5.7.2以下?)はこのように明示的にNULLを指定すれば、エラー無く通ったが、MySQL5.7.3以上はNULLの指定をエラーで弾く、とのこと。

MySQL 5.7.3 m13 does not allow DEFAULT NULL for primary key #13203
rails4.0のgithubのissueに立てられていて、既にcloseされていた。

rails4.1はこの問題が修正されているとのこと。
(下の対策にあるように'DEFAULT NULL’を削除したと思う)

解決策

下記のいずれかをすればよい。
1. 上記のabstract_mysql_adapter.rb内のDEFAULT NULLという文字列を削除する
2. MySQLのバージョンを5.7.2以下にダウングレードする
3. Railsのバージョンを4.1以上にする

筆者は1.を実行し、

$ rake db:migrate
== 20170514132649 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0224s
== 20170514132649 CreateUsers: migrated (0.0224s) =============================

と、正しくDBが作成された。

参考にした記事

mysql 5.7でdb:createするとエラー -Qiita

6
3
2

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
6
3