【问题标题】:RAILS: DB MIGRATION: resetting id column to auto_incrementRAILS:数据库迁移:将 id 列重置为 auto_increment
【发布时间】:2012-06-01 11:04:49
【问题描述】:

当我创建表 users 时,生成的表有一个名为 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,在这里(和谷歌)进行了研究,但没有成功。

编辑:

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

      编辑:This answer 似乎正是您想要的。

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

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

      希望能回答你的问题。

      【讨论】:

      • 默认 ID 字段设置的问题在于,它是一个整数值,设置为有符号,这意味着我的值最多为 2,147,483,647。这似乎是一个非常大的数字,但我正在处理社交网络数据,每天有数千万条记录(它们最终会被归档,但我需要维护 ID 号)。因此,我需要将其设为 bigint、未签名,这样我最多可以得到 18,446,744,073,709,551,615(例如,Twitter 将其推文 ID 提供为 bigint,未签名)。
      • 我了解默认情况下,默认值为NULL,但是在这种情况下,我不小心更改了它,并且想知道,如果有办法删除列并重新创建它将默认值更改回 null。我已经尝试过:default => false,但它会产生 0,而不是 NULL。
      • 关于默认选项我犯了一个意外错误。现在已经改正了,可以试试吗?
      • 我还为您的 ID 相关问题添加了一个链接。参考我原来的答案。
      • 啊,我还没试过nil。我会尝试一下,我也会检查您提供的链接。谢谢。
      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 2012-04-11
      • 2019-04-27
      • 2016-09-01
      • 2017-02-18
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多