RAILS:DB MIGRATION:将id列重置为auto_increment

时间:2012-06-01 11:04:49

标签: ruby-on-rails migration auto-increment dbnull

当我创建表用户时,结果表有一个名为id的列,定义为整数。

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

change_column :users, :id, :integer, :limit => 8, :unsigned => true

哪个确实将它更改为bigint,但它不再是自动增量列(尽管它仍然被识别为主索引,并且它未设置为无符号(即使rails告诉我迁移执行正常)

然后我尝试了:

change_column :users, :id, :integer, :limit => 8, :unsigned => true, :null => false, :auto_increment => true

Rails表示迁移执行得很好,但没有任何改变。

我可以试试像:

change_column :users, :id, :primary_index

但这会让我在我开始的地方

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

顺便说一下,我还试图在另一列上设置默认值为NULL,在此处(和Google)进行了研究,但没有成功。

编辑:

在通过通用迁移创建表的一部分创建列后,似乎无法编辑列“id”。唯一的方法是通过带有MySQL语法的“execute”语句。

2 个答案:

答案 0 :(得分:1)

尝试创建并运行此迁移:

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

答案 1 :(得分:0)

Rails正在关注您正在创建的所有表格的ID字段,并且它对您的迁移甚至是schema.rb文件都是隐藏的。

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

编辑:This answer似乎正是您正在寻找的。

关于“将默认设置为NULL”,再次,为什么要这样做?无论如何,所有列都默认为NULL。但是,如果情况并非如此,您可以在迁移中执行此操作:

change_table :users do |t|
  t.string :description, :default => nil
end

希望能回答你的问题。