在Rails中创建表格及主键问题

44
当我在Rails中使用Mysql2作为数据库管理器运行以下代码时:
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

1
请发布您的迁移代码。听起来您可能有允许空值的复合主键。 - Michael Berkowski
我没有添加,因为我在那里没有看到任何奇怪的东西。不过,我会将其添加到问题中。 - Hedley Quintana
你的MySQL版本是多少?看起来最近的版本与旧版的Rails存在冲突:https://github.com/rails/rails/pull/13247 你能更新一下Rails吗? - Michael Berkowski
我拥有最新版本的Ruby(2.0.0p53)、Rails(4.0.2)以及MySQL服务器版本5.7,都是32位的。 - Hedley Quintana
非常感谢Berkowski先生!我将MySQL服务器从5.7降级到5.6,问题得到了解决! - Hedley Quintana
3个回答

86

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

With Rails 2.3.5, MySQL version 5.7.9 and mysql gem you need to have this bit as an initializer in config/initializers/abstract_mysql_adapter.rb:

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

For mysql2, it should be config/initializers/abstract_mysql2_adapter.rb:

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

29

来自mysql 5.7的变更页面:

主键中的列必须为NOT NULL,但如果明确声明为NULL,则不会产生错误。现在会出现错误。例如,CREATE TABLE t(i INT NULL PRIMARY KEY)这样的语句将被拒绝。类似的ALTER TABLE语句也是如此。(Bug #13995622、Bug #66987、Bug #15967545、Bug #16545198)

MySQL 5.7.3中的更改(2013-12-03,里程碑13)

这个问题已经修复了三个月了。我不知道它将成为哪个Rails版本的一部分。

monkey patch在这里

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

编辑: 实际上,修复此问题的提交可以在这里找到,并显示修复包括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是您的选择,则应该可以解决问题。


请注意,Rails 3 需要猴子补丁:https://dev59.com/hFsX5IYBdhLWcg3wf_n2#34555109 - Joshua Pinter

2

我曾经在使用mysql 5.7.x运行rails 4.0.x应用程序时遇到了问题。通过升级到rails 4.2.x并更新我的gems,我成功地解决了这个问题。

(我知道这些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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接