使用rake db:migrate命令和mysql在Rails中创建表的PRIMARY KEY问题

我的rails版本是4.0.0,我的mysql版本是Ver 14.14 Distrib 5.7.9,适用于Win64(x86_64)。 我正在运行一个旧版本的rails,因为我正在根据我之前的问题获得与mysql的一些冲突。 (查看Kalelc批准的回答我的追索权)

跑步时

rake db:migrate 

我收到以下错误

 == 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, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDBC:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' C:in `migrate' 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, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' C:in `migrate' Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up' C:in `migrate' Tasks: TOP => db:migrate (See full trace by running task with --trace) 

我的代码中没有将任何值设置为NULL,这是代码

 Class CreateUsers  25 t.string "last_name", :limit => 50 t.string "email", :default => "", :null => false t.string "password", :limit => 40 t.timestamps end end def down drop_table :users end end 

此代码完全如我正在遵循的教程中所示。 我还在堆栈溢出中调查了其他类似的问题 ,并遵循给出的建议。 我按照建议尝试了猴子补丁

 # lib/patches/abastract_mysql_adapter.rb class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end 

我将此文件插入到我在simple_cms应用程序的lib中创建的名为patches的文件夹中。 我已按照同一个猴子补丁中的建议将文件保存为“abstract_mysql_adapter.rb”。 我已经使用以下内容更新了simple_cms应用程序的environment.rb

 require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__) 

如果我然后运行rake db:migrate命令

 rake aborted! LoadError: cannot load such file -- C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb C:/Users/Lizanne/Documents/Code/Sites/simple_cms/config/environment.rb:3:in `' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace) 

C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb绝对是猴子补丁的路径。 我把补丁放在了错误的地方吗? 我在这里做错了什么,摸不着头脑? 抱歉,如果这对某些人来说是显而易见的,但是在经过长时间的禁欲后我又回到了编码状态,我无法理解这个问题。 非常感谢您的帮助:)

我最近也面临同样的问题。

MySQL 5.7不再支持主键的空默认值。

通过覆盖MySql中主键的Native默认值,您可以解决您的问题。

在config / initializers / abstract_mysql_adapter.rb中:

 class ActiveRecord::ConnectionAdapters::MysqlAdapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end 

对于mysql2,它应该是config / initializers / abstract_mysql2_adapter.rb:

 class ActiveRecord::ConnectionAdapters::Mysql2Adapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end 

上面的解决方案没有运气(我的环境:Rails 3.0.20,MySQL 5.7.13,Ruby 1.9.3p551)。 能够通过覆盖ActiveRecord::ConnectionAdapters::ColumnDefinition类来绕过它。 见下文:

 class ActiveRecord::ConnectionAdapters::ColumnDefinition def sql_type type.to_sym == :primary_key ? 'int(11) auto_increment PRIMARY KEY' : base.type_to_sql(type.to_sym, limit, precision, scale) rescue type end end 

在config / initializers / column_definition.rb中存储它

我也有这个问题(mysql 5.7.17和Rails 4.0.0)。 我通过添加file config/initializers/mysql2_adapter.rb修复它

 require 'active_record/connection_adapters/mysql2_adapter' class ActiveRecord::ConnectionAdapters::Mysql2Adapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end 

然后,在我的everionment.rb文件中:

 require File.expand_path('../initializers/mysql2_adapter', __FILE__) 

从MySQL 5.7.3开始,声明为NULL的主键会产生错误:

PRIMARY KEY中的列必须为NOT NULL,但如果显式声明为NULL则不会产生错误。 现在发生错误。 例如,拒绝诸如CREATE TABLE t(i INT NULL PRIMARY KEY)之类的语句。 类似的ALTER TABLE语句也是如此。 (Bug#13995622,Bug#66987,Bug#15967545,Bug#16545198)

但是Rails版本中的create_table仍然需要PRIMARY KEYDEFAULTNULL 。 我已经通过更新到更新的rails版本解决了这个问题。

我在JRuby上使用Rails应用程序解决了这个问题我正在通过升级mysql-adapter

我使用gem activerecord-jdbcmysql-adapter v1.3.14并升级到v1.3.21

猴子修补解决方案之前,请检查您的jdbc适配器版本。