【问题标题】:How can I set the starting point for the primary key (ID) column in Postgres via a rails migration如何通过 rails 迁移在 Postgres 中设置主键 (ID) 列的起点
【发布时间】:2010-11-28 11:14:23
【问题描述】:

我正在将一个 Rails 应用程序部署到使用 PostgreSQL 作为其后端的 heroku。在我的数据库迁移中,我通常将报告等的 ID 字段设置为至少 1000,大多数客户似乎不喜欢从 1 开始。

通常我使用 mysql,我只是在创建表后添加一个特定的 sql:

def self.up
    create_table :reports do |t|
       t.references :something
       ...
    end
    execute("ALTER TABLE reports AUTO_INCREMENT = 1000;")
end

有谁知道我如何为 PostgreSQL 实现相同的目标,理想情况下,我希望迁移来构建表本身,这样就不是特定于数据库的。

我想实现目标的一种愚蠢方法是循环创建和删除 999 条记录,哎呀。

【问题讨论】:

    标签: sql ruby-on-rails postgresql migration


    【解决方案1】:

    不知道红宝石和铁路部分,但您正在谈论的问题是

    ALTER SEQUENCE reports_something_seq RESTART 1000;
    

    您必须在您的表中查找序列名称和 postgresql 文档,以获取有关此事的一般教育;-)

    【讨论】:

    • 感谢两位的更新,我刚刚下载了一个数据库转储,看起来就是这个:CREATE SEQUENCE reports_id_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;
    • 是的,您可以设置在CREATE SEQUENCE 时间开始,在这种情况下,您只需将START 1000 添加到语句中。但是以后要更改它,您需要ALTER,而不是CREATE 命令。
    • 哈哈,谢谢,我没有尝试使用 CREATE 命令,只是突出显示“已”用于生成序列的内容,即从迁移文件生成的 SQL。正如你所提到的,我使用了 ALTER 和 RESTART ,它很有魅力。如果我要在基于生产的应用程序中使用 Postgres,我一定会阅读它。
    • 它确实有效,但是......有人知道在迁移中执行此操作的一种很好的数据库无关的 Railsy 方式吗?
    【解决方案2】:

    在 postgres 中,与许多其他数据库一样,自动增量功能是通过序列完成的。对于每个 Serial 和类似字段序列,Postres 会自动为您创建并命名为 TABLENAME _ COLUMNNAME _ seq。

    所以,你只需要改变相应的顺序,像这样:

    ALTER SEQUENCE example_id_seq RESTART 1000 -- corrected from START
    

    【讨论】:

    • 哈哈,我犯了同样的错误,但在查找\h alter sequence 后更正了以防万一;-) 它是RESTART,而不是STARTSTART 代表CREATE SEQUENCE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多