Mysql Rails 5.1:主键不是BIGINT
使用Mysql Rails 5.1:主键不是BIGINT,mysql,ruby-on-rails,ruby,database,ruby-on-rails-5,Mysql,Ruby On Rails,Ruby,Database,Ruby On Rails 5,使用rails5.1.beta1和mysql2,迁移应该使用BIGINT作为主键整数 我的主键仍然都是4位整数 示例: db/migrate/201703111129_create_receipts.rb class CreateReceipts
rails5.1.beta1
和mysql2
,迁移应该使用BIGINT
作为主键整数
我的主键仍然都是4位整数
示例: db/migrate/201703111129_create_receipts.rb
class CreateReceipts
尝试将BIGINT
设置为id
,Rails引发以下异常:
ActiveModel::RangeError:5473508900871246157超出ActiveModel::Type::Integer的范围,限制为4字节
在Rails 5.1.beta1中,主键仍然是4字节整数,因为它在master上不可复制。但是,如果要设置BigInt,即8字节无符号值,则可以尝试以下方法: 案例1:如果您尚未迁移或表中没有数据。对于特定表,您可以使用:
class CreateReceipts < ActiveRecord::Migration[5.1]
def change
create_table :receipts, :id => false do |t|
t.integer :id, :limit => 8
t.timestamps null: false
end
end
end
并在生成的迁移文件中添加
def change
change_column :receipts, :id, :bigint
end
我在Rails 5.0.2和5.1.beta1中尝试过这种方法,在这两个版本中效果都很好
案例3:您希望为创建的每个表将默认主键设置为BigInt,而不希望弄乱迁移文件。
将其添加到config/environment.rb的底部
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
除了案例2之外您还可以使用execute
方法更改Id类型
def up
execute('ALTER TABLE receipts MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
end
def down
raise ActiveRecord::IrreversibleMigration
end
ActiveRecord不支持这一点。此方法的缺点是,当您回滚迁移时,ActiveRecord会引发错误,因为它不知道如何还原它。该表的SHOW CREATE TABLE
将其描述为什么?当我遇到此问题时,这让我很反感。我的数据库使用了BIGINT
数据类型。将rails
升级到5.1.0.rc1
后,它可以正常工作-似乎ActiveRecord
出现了一些问题。我已经进行了广泛的讨论,在将rails
升级到5.1.0.rc1
之后,它运行良好-似乎ActiveRecord
出现了一些问题。我已经进行了广泛的讨论和讨论
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
def up
execute('ALTER TABLE receipts MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
end
def down
raise ActiveRecord::IrreversibleMigration
end