在MySQL中使用rake db:migrate命令在Rails中创建表的主键问题

PRIMARY KEY issue with creating tables in Rails using rake db:migrate command with mysql

我的Rails版本是4.0.0,我的mysql版本是Win 14.(x86_64)的Ver 14.14 Distrib 5.7.9。我正在使用旧版本的rails,因为按照我之前的问题在这里与mysql发生了一些冲突。 (请查看Kalelc的批准答案以求助于我)

运行时

1
rake db:migrate

出现以下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
==  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,这是代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Class CreateUsers < ActiveRecord::Migration

  def up
    create_table :users do |t|
      t.column"first_name", :string, :limit => 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

此代码与我所遵循的教程中的代码完全相同。我还研究了堆栈溢出方面的其他类似问题,并遵循了给出的建议。我已按照建议尝试过猴子补丁

1
2
3
4
# 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中创建的名为patch的文件夹中。我已将文件另存为" abstract_mysql_adapter.rb "
就像在同一只猴子补丁中所建议的那样。
我已经使用以下

更新了simple_cms应用程序的environment.rb

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

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

1
2
3
4
5
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 `<top (required)>'
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中主键的本机默认值,可以解决您的问题。

在config / initializers / abstract_mysql_adapter.rb中:

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

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

1
2
3
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类来解决它。见下文:

1
2
3
4
5
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

来修复它

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

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

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


自MySQL 5.7.3起,声明为NULL的主键会产生错误:

Columns in a PRIMARY KEY must be NOT NULL, but if declared explicitly
as NULL produced no error. Now an error occurs. For example, a
statement such as CREATE TABLE t (i INT NULL PRIMARY KEY) is rejected.
The same occurs for similar ALTER TABLE statements. (Bug #13995622,
Bug #66987, Bug #15967545, Bug #16545198)

但是您的Rails版本中的create_table仍然需要DEFAULTNULL作为PRIMARY KEY。我已经通过更新到较新的Rails版本解决了该问题。


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

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

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