Mysql2 ::错误:PRIMARY KEY的所有部分必须为NOT NULL;如果键中需要NULL,请改用UNIQUE

时间:2016-11-23 07:17:04

标签: ruby-on-rails ruby-on-rails-3

我已在rails 3.2.9ruby versiion 2.0.0中创建了一个演示应用程序。脚手架Blog模型后我试图迁移它,但有以下问题。

  

#rake db:migrate

     

== CreateBlogs:迁移========================================== ==========

     

- create_table(:blogs)   耙子流产了!

     

StandardError:发生错误,所有以后的迁移都被取消:

     

Mysql2 ::错误:PRIMARY KEY的所有部分必须为NOT NULL;如果在键中需要NULL,请改用UNIQUE:CREATE TABLE blogsid int(11)DEFAULT NULL auto_increment PRIMARY KEY,title varchar(255),description text,created_at datetime NOT NULL,updated_at datetime NOT NULL)ENGINE = InnoDB   /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/activerecord-3.2.9/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in query' /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/activerecord-3.2.9/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in阻止执行& #39;   /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/activerecord -

...

...

...

  

-3.2.9 / lib / active_record / migration.rb:551:在migrate' /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/activerecord-3.2.9/lib/active_record/railties/databases.rake:179:in块(2级)中'   /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/rake-11.3.0/exe/rake:27:in`'   任务:TOP => DB:迁移   (通过使用--trace运行任务查看完整跟踪)

4 个答案:

答案 0 :(得分:38)

配置/初始化/ abstract_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

答案 1 :(得分:0)

在这一行id int(11) DEFAULT NULL auto_increment PRIMARY KEY中,您创建了一个主键(永远不能为null),默认值为NULL。 在迁移文件(或schema.rb)中,您应确保删除DEFAULT NULL部分。

答案 2 :(得分:0)

当使用 主键 列定义了 不为空 时,发生此错误。

即使您定义了任何 复合键 ,这些列定义也不包含 not null 条件

搜索这些列,删除 不为空 条件,这是删除错误的解决方案之一。

答案 3 :(得分:0)

我也遇到了这个问题(mysql 0.3.21和Rails 3.2.22.5)。 我通过在应用程序config / initializers / mysql2_adapter.rb中添加一个文件来修复它(因为之前没有这样的文件)

在下面的内容中添加了

需要'active_record / connection_adapters / mysql2_adapter' ActiveRecord :: ConnectionAdapters :: Mysql2Adapter类 NATIVE_DATABASE_TYPES [:primary_key] =“ int(11)自动增量主键” 结束

然后在内容下面添加的我的environment.rb文件中,

需要File.expand_path('../ initializers / mysql2_adapter', FILE

它奏效了。