【问题标题】:Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE insteadMysql2::Error: PRIMARY KEY 的所有部分都不能为空;如果您需要在键中使用 NULL,请改用 UNIQUE
【发布时间】:2016-11-23 07:17:03
【问题描述】:

我在 rails 3.2.9ruby versiion 2.0.0 创建了一个演示应用程序。在搭建博客模型后,我正在尝试迁移它,但遇到以下问题。

# rake db:迁移

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

-- create_table(:blogs) 耙子中止了!

StandardError:发生错误,所有后续迁移都已取消:

Mysql2::Error: PRIMARY KEY 的所有部分都不能为空;如果您需要在键中使用 NULL,请改用 UNIQUE: CREATE TABLE blogs (id 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:inblock 在执行' /usr/local/rvm/gems/ruby-2.0.0-p648@demo-app/gems/activerecord-

....

....

....

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

【问题讨论】:

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


    【解决方案1】:

    添加这个初始化器来解决问题:

    config/initializers/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
    

    【讨论】:

    • 在 Rails 3.2.22.5 中要求行应该是require 'active_record/connection_adapters/abstract_mysql_adapter'。关于为什么 Rails3 中存在此问题的背景信息如下:github.com/brianmario/mysql2/issues/784#issuecomment-414878642
    • 只遵循这个答案并没有为我解决这个问题。但是,我发现这个报告了issue on git。从 cmets 找到这条线解决了我的问题。完成上述操作后,您需要在 envrionment.rb 文件中添加以下行。需要 File.expand_path('../initializers/abstract_mysql2_adapter', FILE)。我希望它能帮助某人解决这个问题。
    【解决方案2】:

    我也遇到过这个问题(mysql 0.3.21 和 Rails 3.2.22.5)。 我通过在我的应用程序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
    

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

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

    【讨论】:

      【解决方案3】:

      not null 使用 主键 列定义时发生此错误。

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

      搜索那些列,删除 not null 条件,这是删除错误的解决方案之一。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-22
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          相关资源
          最近更新 更多