Ruby on rails RAILS:DB迁移:将id列重置为自动增量

Ruby on rails RAILS:DB迁移:将id列重置为自动增量,ruby-on-rails,migration,auto-increment,dbnull,Ruby On Rails,Migration,Auto Increment,Dbnull,当我创建表users时,生成的表有一个名为id的列,定义为整数 我尝试将其修改为bigint,未签名,如下所示: change_column :users, :id, :integer, :limit => 8, :unsigned => true 它确实将其更改为bigint,但它不再是一个自动递增列(尽管它仍然被标识为主索引,并且没有设置为unsigned(尽管rails告诉我迁移执行得很好) 然后我试着做: change_column :users, :id, :intege

当我创建表users时,生成的表有一个名为id的列,定义为整数

我尝试将其修改为bigint,未签名,如下所示:

change_column :users, :id, :integer, :limit => 8, :unsigned => true
它确实将其更改为bigint,但它不再是一个自动递增列(尽管它仍然被标识为主索引,并且没有设置为unsigned(尽管rails告诉我迁移执行得很好)

然后我试着做:

change_column :users, :id, :integer, :limit => 8, :unsigned => true, :null => false, :auto_increment => true
Rails表示迁移执行得很好,但没有任何变化

我可以试试这样的东西:

change_column :users, :id, :primary_index
但这会让我回到起点

我也可以用MySQL代码尝试一个“execute”语句,但我想保持迁移文件的“干净”。有人遇到过这个问题吗

顺便说一句,我还在另一列上尝试将默认值设置为NULL,在这里(和谷歌)进行了研究,但没有成功

编辑:


在通过通用迁移创建列“id”作为表创建的一部分之后,似乎没有办法编辑该列。唯一的方法是通过“执行”使用MySQL语法的语句。

Rails负责您正在创建的所有表的ID字段,它在迁移过程中甚至在
schema.rb
文件中都是隐藏的

所以我建议你退后一步,想想:你为什么要搞砸它?你确定这是真的需要吗

编辑:似乎正是你想要的

关于“将默认值设置为NULL”,您为什么要这样做?所有列都默认为NULL。但是,如果不是这样,您可以在迁移中这样做:

change_table :users do |t|
  t.string :description, :default => nil
end
class ChangeColumnUserIdToAutoIncrement < ActiveRecord::Migration

  def self.up
    execute "ALTER TABLE users modify COLUMN id int(8) AUTO_INCREMENT"
  end

  def self.down
    execute "ALTER TABLE users modify COLUMN id int(8)"
  end
end

希望这能回答您的问题。

尝试创建并运行此迁移:

change_table :users do |t|
  t.string :description, :default => nil
end
class ChangeColumnUserIdToAutoIncrement < ActiveRecord::Migration

  def self.up
    execute "ALTER TABLE users modify COLUMN id int(8) AUTO_INCREMENT"
  end

  def self.down
    execute "ALTER TABLE users modify COLUMN id int(8)"
  end
end
class ChangeColumnUserIdToAutoIncrement
默认ID字段设置的问题是,它是一个整数值,设置为有符号,这意味着我最多只能使用2147483647。这似乎是一个非常大的数字,但我处理的是社交网络数据,每天有数千万条记录(它们最终被存档了,但我需要保留ID号)。因此,我需要将其设置为bigint,unsigned,这使我最多可以看到18446744073709551615(例如,Twitter提供了其tweet ID为bigint,unsigned)。我知道默认情况下,默认值为NULL,但在这种情况下,我意外更改了它,除了删除列并重新创建它之外,我想知道是否有办法将默认值更改回NULL。我已经尝试过:default=>false,但它会生成一个0,而不是NULL。关于默认选项,我有一个意外错误ake。现在已经更正了,你能试试吗?我还为你的ID相关问题添加了一个链接。请参考我的原始答案。啊,我还没有尝试过nil。我会试试,我也会检查你提供的链接。谢谢。