为字段创建PostgreSQL序列(不是记录的ID)

Tan*_*vir 8 postgresql activerecord ruby-on-rails rails-postgresql rails-activerecord

我正在开发一个Ruby on Rails应用程序.我们正在使用PostgreSQL数据库.

有一个以scores下列列命名的表:

Column        | Type
--------------+-----------------------
id            | integer
value         | double precision
ran_at        | timestamp
active        | boolean
build_id      | bigint
metric_id     | integer
platform_id   | integer
mode_id       | integer
machine_id    | integer
higher_better | boolean
job_id        | integer
variation_id  | integer
step          | character varying(255)
Run Code Online (Sandbox Code Playgroud)

我需要一个添加序列job_id(注:没有模型job).

如何创建此序列?

Erw*_*ter 31

用途CREATE SEQUENCE:

CREATE SEQUENCE scores_job_id_seq;  -- = default name for plain a serial
Run Code Online (Sandbox Code Playgroud)

然后添加一个默认列scores.job_id:

ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');
Run Code Online (Sandbox Code Playgroud)

如果要将序列绑定到列(因此在删除列时将其删除),还要运行:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;
Run Code Online (Sandbox Code Playgroud)

所有这一切都可以使用伪数据类型被替换serial为列job_id开始与:

如果您的表已有行,您可能需要将其设置SEQUENCE为下一个最高值并在表中填写缺少的序列值:

SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;
Run Code Online (Sandbox Code Playgroud)

可选:

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;
Run Code Online (Sandbox Code Playgroud)

唯一剩下的差异,serial列也设置为NOT NULL.您可能也可能不想要这样:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
Run Code Online (Sandbox Code Playgroud)

但是不能只改变现有的类型integer:

ALTER TABLE scores ALTER job_id TYPE serial;
Run Code Online (Sandbox Code Playgroud)

serial不是实际的数据类型.它只是一个符号的便利功能CREATE TABLE.
在Postgres 10或更高版本中考虑一IDENTITY列:

  • @taa你试过搜索过吗?http://stackoverflow.com/q/7606994/1499698 http://stackoverflow.com/q/7820747/1499698 (2认同)

Tan*_*vir 16

所以我想出了如何在Ruby on Rails上使用ActiveRecord迁移来实现这一点.我基本上从这个页面使用了Erwin的命令和帮助,并将它们放在迁移文件中.这些是步骤:

1.在终端中输入:

rails g migration CreateJobIdSequence
rails g migration AddJobIdSequenceToScores
Run Code Online (Sandbox Code Playgroud)

2.编辑迁移文件,如下所示:

20140709181616_create_job_id_sequence.rb:

class CreateJobIdSequence < ActiveRecord::Migration
  def up
    execute <<-SQL
      CREATE SEQUENCE job_id_seq;
    SQL
  end

  def down
    execute <<-SQL
      DROP SEQUENCE job_id_seq;
    SQL
  end
end
Run Code Online (Sandbox Code Playgroud)

20140709182313_add_job_id_sequence_to_scores.rb:

class AddJobIdSequenceToScores < ActiveRecord::Migration
  def up
    execute <<-SQL
      ALTER SEQUENCE job_id_seq OWNED BY scores.job_id;
      ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('job_id_seq');
    SQL
  end

  def down
    execute <<-SQL
      ALTER SEQUENCE job_id_seq OWNED BY NONE;
      ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
    SQL
  end
end
Run Code Online (Sandbox Code Playgroud)

3.迁移数据库.在终端类型中:

rake db:migrate
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

11417 次

最近记录:

6 年,10 月 前