2014-01-12 13 views
40

当我尝试运行使用Mysql2作为数据库管理器中的Rails下面的代码:创建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 
+1

请发表您的迁移的代码。听起来像你可能有复合PK允许空值。 –

+0

我没有加入,因为我没有看到任何奇怪的地方。但是,我将它添加到问题 –

+0

什么是您的MySQL版本。它看起来像一个非常新的版本与旧的Rails版本冲突:https://github.com/rails/rails/pull/13247你可以更新Rails吗? –

回答

25

从MySQL 5.7重大更改页面:

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)

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

这个问题was fixed 3个月前。我不知道是什么Rails的版本,它的将是

猴子补丁的一部分是here

编辑: 它已经超过一年,这个修复程序合并到主更多。所以,它必须是最后一个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是您的一个选择,那么它应该解决问题。

+0

仅供参考,Rails 3所需的猴子补丁:http://stackoverflow.com/a/34555109/293280 –

78

我以前有一个同样的问题,我按照这里 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 
+0

感谢buddy .. :) –

2

解决我只好用mysql 5.7.x.运行轨道4.0.x的应用程序这个问题我可以通过升级到rails 4.2.x和升级我的宝石来修复它。

(我敢肯定,这些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