【问题标题】:Creating tables and problems with primary key in Rails在 Rails 中创建表和主键问题
【发布时间】:2014-01-31 06:25:34
【问题描述】:

当我尝试使用 Mysql2 作为数据库管理器在 Rails 中运行以下代码时:

rake db:migrate

我收到以下错误:

 rake aborted!
 "Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL:"

如果默认情况下表中的主键不是“null”,为什么会出现此错误?

但是迁移代码:

class CreateUsers < ActiveRecord::Migration
   def change
    create_table :users do |t|
     t.string "first_name"
     t.timestamps
    end
   end 
end

【问题讨论】:

  • 请发布您的迁移代码。听起来您可能有允许空值的复合 PK。
  • 我没有添加,因为我没有看到任何奇怪的地方。但是,我将其添加到问题中
  • 你的 MySQL 版本是多少。看起来最近的版本与旧的 Rails 版本冲突:github.com/rails/rails/pull/13247 你能更新 Rails 吗?
  • 我有最新版本的 Ruby (2.0.0p53)、Rails (4.0.2) 和 MySQL 服务器版本 5.7,都是 32 位的。
  • 非常感谢 Berkowski 先生!我将 MySQL 服务器从 5.7 降级到 5.6,问题就解决了!

标签: mysql ruby-on-rails primary-key mysql2


【解决方案1】:

我之前也遇到过同样的问题,按照这里解决了 https://github.com/rails/rails/pull/13247#issuecomment-32425844

使用 Rails 2.3.5、MySQL 版本 5.7.9 和 mysql gem 你需要 这个位作为初始化器 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

【讨论】:

    【解决方案2】:

    来自 mysql 5.7 重大更改页面:

    PRIMARY KEY 中的列必须不是 NULL,但如果显式声明 因为 NULL 没有产生错误。现在发生错误。例如,一个 CREATE TABLE t (i INT NULL PRIMARY KEY) 等语句被拒绝。 类似的 ALTER TABLE 语句也是如此。 (错误号 13995622, 错误 #66987、错误 #15967545、错误 #16545198)

    Changes in MySQL 5.7.3 (2013-12-03, Milestone 13)

    这个问题was fixed 3 个月前。我不知道它将成为哪个 Rails 版本的一部分

    猴子补丁是here

    编辑: 这个修复被合并到master已经一年多了。所以,它必须是 Rails 最新版本的一部分。

    编辑: 实际上,修复此问题的提交可以在:https://github.com/yahonda/rails/commit/b6655885ef13cf8d1705dc9b5232846f0207febd 中找到,并显示修复包含在 v4.2.0.beta1, v4.1.6.rc1, v4.1.5, v4.1.4, v4.1.3, v4.1.2, v4.1.2.rc3, v4.1.2.rc2, v4.1.2.rc1, v4.1.1, v4.1.0, v4.1.0.rc2, v4.1.0.rc1, v4.1.0.beta2, v4.1.0.beta1 中。如果您可以选择升级到至少 v4.1.0,那么它应该可以解决问题。

    【讨论】:

    【解决方案3】:

    我在使用 mysql 5.7.x 运行 rails 4.0.x 应用程序时遇到了这个问题。我可以通过升级到 rails 4.2.x 并升级我的 gem 来修复它。

    (我确信这些 gemfiles 需要工作,但希望它们仍然有用)

    旧的 Gemfile

    source 'https://rubygems.org'
    ruby '2.0.0'
    
    # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
    gem 'rails', '4.0.13'
    gem 'mysql2'
    # Use unicorn as the app server
    # gem 'unicorn'
    
    gem 'sidekiq'
    gem 'sinatra'
    gem 'whenever'
    
    gem 'thin'
    gem 'faye'
    gem 'faye-websocket'
    
    #pdf generation
    gem 'wicked_pdf'
    gem 'wkhtmltopdf-binary'
    
    # Assets
    gem 'backbone-on-rails', '~> 0.9.9'
    gem 'coffee-rails', '~> 4.0.1'
    gem 'coffee-script-source', '=1.8.0'
    gem 'ejs'                                   # uses templates for backbone
    gem 'jquery-rails'
    gem 'jquery-ui-rails'
    gem 'neat'
    gem 'sass-rails', '~> 4.0.3'
    gem 'therubyracer'
    gem 'turbolinks'
    gem 'uglifier', '>= 1.3.0'
    
    gem 'active_model_serializers', '0.8.3'
    gem 'acts_as_list'
    gem 'bcrypt-ruby', '~> 3.1.2'
    gem 'bootstrap-sass', '~> 3.2.0.0'
    gem 'bower-rails'
    gem 'carrierwave'
    gem 'enumerize'
    gem 'embedly'                         # Url to Attachment Processing
    gem 'fancybox2-rails', '~> 0.2.4'
    gem 'flamegraph'
    gem 'fog'                     # s3 storage
    gem 'globalize'   # I18n for tagging, etc.
    gem 'globalize-accessors'
    gem 'i18n-tasks', '~> 0.8.3'
    gem 'hirb'
    gem 'kaminari'
    gem 'nokogiri'
    gem 'newrelic_rpm'
    gem 'select2-rails'                   # Token Fields
    gem 'twilio-ruby'
    gem 'rails_autolink'                  # Convert urls to links
    gem 'redis', '3.2.1'
    gem 'rest-client'
    gem 'rmagick'
    gem 'rubyzip', :require => 'zip'        # Zip files together
    gem 'unf'
    gem 'mailgun-ruby', '~>1.0.3', require: 'mailgun'
    
    # Deployments
    gem 'mina'
    
    group :doc do
      gem 'sdoc'
    end
    
    group :test do
      gem 'rspec-rails', "= 2.14.2"
      gem 'shoulda-matchers', :require => false
      gem 'simplecov', '~> 0.9.2'
      gem 'database_cleaner'
      gem 'codeclimate-test-reporter', require: nil
    end
    
    group :development, :test do
      gem 'quiet_assets'
      gem 'factory_girl_rails', "~> 4.0"
      gem 'guard', '>=2.1.0'
      gem 'guard-rspec', '= 4.2.9'
      gem 'spring', '1.3.6'
      gem 'spring-commands-rspec'
      gem 'foreman'
    end
    

    新的 Gemfile

    source 'https://rubygems.org'
    ruby '2.3.0'
    
    # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
    gem 'rails', '4.2.5'
    gem 'mysql2'
    gem 'stackprof'
    # Use unicorn as the app server
    # gem 'unicorn'
    
    gem 'sidekiq'
    gem 'sinatra'
    gem 'whenever'
    
    gem 'thin'
    gem 'faye'
    gem 'faye-websocket'
    
    #pdf generation
    gem 'wicked_pdf'
    gem 'wkhtmltopdf-binary'
    
    # Assets
    gem 'backbone-on-rails', '~> 0.9.9'
    gem 'coffee-rails', '~> 4.0.1'
    gem 'coffee-script-source', '=1.8.0'
    gem 'ejs'                                   # uses templates for backbone
    gem 'jquery-rails'
    gem 'jquery-ui-rails'
    gem 'neat'
    gem 'sass-rails', '~> 4.0.3'
    gem 'therubyracer'
    gem 'turbolinks'
    gem 'uglifier', '>= 1.3.0'
    
    gem 'active_model_serializers', '0.8.3'
    gem 'acts_as_list'
    gem 'bcrypt', '~> 3.1.2'
    gem 'bootstrap-sass', '~> 3.2.0.0'
    gem 'bower-rails'
    gem 'carrierwave'
    gem 'enumerize'
    gem 'embedly'                         # Url to Attachment Processing
    gem 'fancybox2-rails', '~> 0.2.4'
    gem 'flamegraph'
    gem 'fog'                     # s3 storage
    gem 'globalize'   # I18n for tagging, etc.
    gem 'globalize-accessors'
    gem 'i18n-tasks', '~> 0.8.3'
    gem 'hirb'
    gem 'kaminari'
    gem 'nokogiri'
    gem 'newrelic_rpm'
    gem 'select2-rails'                   # Token Fields
    gem 'twilio-ruby'
    gem 'rails_autolink'                  # Convert urls to links
    gem 'redis', '3.2.1'
    gem 'rest-client'
    gem 'rmagick'
    gem 'rubyzip', :require => 'zip'        # Zip files together
    gem 'unf'
    gem 'mailgun-ruby', '~>1.0.3', require: 'mailgun'
    gem 'rack-cors', :require => 'rack/cors'
    
    # Deployments
    gem 'mina'
    
    group :doc do
      gem 'sdoc'
    end
    
    group :test do
      gem 'rspec-rails', "= 2.14.2"
      gem 'shoulda-matchers', :require => false
      gem 'simplecov', '~> 0.9.2'
      gem 'database_cleaner'
      gem 'codeclimate-test-reporter', require: nil
    end
    
    group :development, :test do
      gem 'quiet_assets'
      gem 'factory_girl_rails', "~> 4.0"
      gem 'guard', '>=2.1.0'
      gem 'guard-rspec', '= 4.2.9'
      gem 'spring', '1.6.1'
      gem 'spring-commands-rspec'
      gem 'foreman'
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多