use*_*081 4 postgresql activerecord ruby-on-rails rails-migrations rails-activerecord
我需要将特定的 Postgres 序列分配给表的 ID 字段。在模型中,我尝试定义以下对 Posgres 没有影响的设置:
类 MyObject < ActiveRecord::Base
self.sequence_name = "global_seq"
通常,ActiveRecord 迁移中的表定义以
create_table "objects", id: :serial, force: :cascade do |t|
它生成列默认值的 Postgres 定义为
default nextval('objects_id_seq'::regclass)
如何在迁移中指定 nextval() 函数应该依赖于另一个序列?
您可以更改迁移中的默认值:
change_column :my_objects, :id, :integer, default: -> { "nextval('global_seq')" }
您可能想要使用:bigint而不是:integer取决于序列和表的设置方式。您必须使用 lambda 作为选项:default才能将原始nextval('global_seq')表达式存入数据库。
您可能也想删除旧的序列,据我所知,您必须使用connection.execute('drop sequence ...')它。
如果您跳过默认:id步骤,create_table那么您可以在手动创建列时完成所有操作:id:
create_table :my_objects, id: false do |t|
  t.bigint :id, null: false, default: -> { "nextval('global_seq')" }
  t.primary_key :id
  ...
end
t.bigint同样,在和 之间进行选择t.integer取决于您希望 PK 有多大。
| 归档时间: | 
 | 
| 查看次数: | 7374 次 | 
| 最近记录: |