2

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

我尝试将其修改为 bigint, unsigned 如下:

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,在这里(和谷歌)进行了研究,但没有成功。

编辑:

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

4

2 回答 2

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
于 2013-08-20T19:11:16.920 回答
0

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

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

编辑:这个答案似乎正是您正在寻找的。

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

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

希望这能回答你的问题。

于 2012-06-01T11:15:38.683 回答