【问题标题】:How to force primary key in ActiveRecord with PostgreSQL to jump start from a specific integer value?如何使用 PostgreSQL 强制 ActiveRecord 中的主键从特定整数值开始?
【发布时间】:2011-09-26 17:27:11
【问题描述】:

从此:How to make a primary key start from 1000?看来我需要发出SQL命令:ALTER TABLE tbl AUTO_INCREMENT = 1000; 但我只是通过 ActiveRecord 抽象处理数据库。有没有办法通过活动记录来实现它?是在迁移时还是在数据库上创建新记录时动态?

我尝试了以下两种方法,但都失败了:

@record= myRecord.new
while @record.id < 1000 do
    @record= myRecord.new
end

效率低下,但只会发生一次,但 Rails 报告 @record.id 为 nil,因此无法进行

@record.save
if @record.id <1000
    @record.id = 1000 + @record.id
    @record.save!             
end

rails 以某种方式报告 @record 中的唯一字段之一已经存在,因此无法再次保存 @record。

编辑:我的错,上面是 MySQL 命令......对于 PostgreSQL,它似乎是沿线的东西(http://archives.postgresql.org/pgsql-general/2006-10/msg01417.php):

 SELECT setval('id_seq',100111);

但是,我尝试在我的部署环境(Heroku 上的共享数据库)的 Ruby 控制台上运行它,但我得到了 !Internal server error back :-( 我的 ruby​​ 类被称为:

class Mytable < ActiveRecord::Base

所以我运行这个命令:

Mytable.connection.execute('SELECT setval('id_seq', 1000)')

并得到内部服务器错误(在上述命令中尝试使用“id”和“id_seq”) 但可能是某种 Ruby on Heroku 特定问题导致了问题,所以我会调查并发布另一个问题,而不是更改这个问题。谢谢!

添加相关PostgreSQL命令资料:

http://pointbeing.net/weblog/2008/03/mysql-versus-postgresql-adding-an-auto-increment-column-to-a-table.html

http://archives.postgresql.org/pgsql-general/2006-10/msg01417.php

How to reset postgres' primary key sequence when it falls out of sync?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord primary-key


    【解决方案1】:

    你可以像这样执行原始 sql:

    ActiveRecord::Base.connection.execute('ALTER TABLE tbl AUTO_INCREMENT = 1000');
    

    或来自 ActiveRecord::Base 的任何后代(即任何模型类),如下所示:

    MyRecord.connection.execute('ALTER TABLE tbl AUTO_INCREMENT = 1000')
    

    【讨论】:

    • 我很确定在 PostgreSQL 中这将失败,因为在 alter table 中没有 auto_increment =。您需要找到正在使用的序列,然后发出类似“select setval('seqname',1000);”的命令
    • @ScottMarlowe,你可能是对的,因为我不熟悉 PostgreSQL,所以我只是在所需的文字 SQL 上接受了 OP 的话。如果您熟悉它,也许您可​​以发布比我更好的答案?
    • 感谢@ScottMarlowe!在阅读您的评论之前,我还找到了 PostgreSQL 命令。我正在为类使用默认的 ActiveRecord 自动生成的主键,所以它只是命名为“id”,但我不知道与其值生成相关联的序列的名称。
    • Ben Lee,您的答案基本上是正确的,如何运行原始 sql。我刚刚添加了最后一点。至于序列名称,您可以以任何方式连接到数据库以运行 \d 表名并查看吗?如果不是,它通常遵循 tablename_colname_seq 的标准命名约定。所以像 select setval('table_col_seq',1000);
    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多