Creating a PostgreSQL sequence to a field (which is not the ID of the record)

activerecord, postgresql, rails-activerecord, rails-postgresql, ruby-on-rails

Solution

Use `CREATE SEQUENCE`:

CREATE SEQUENCE scores_job_id_seq;  -- = default name for plain a serial

Then add a column default to `scores.job_id`:

ALTER TABLE scores ALTER COLUMN job_id
SET DEFAULT nextval('scores_job_id_seq');

If you want to "bind" the sequence to the column (so it is deleted when the column is deleted), also run:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

All of this can be replaced with using the pseudo data type `serial` for the column `job_id` to begin with. See:

- Safely rename tables using serial primary key columns

If your table already has rows, you may want to set the `SEQUENCE` to the next highest value:

SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;

And, fill in missing (null) serial values in the table (if any):

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;

- How to check a sequence efficiently for used and unused values in PostgreSQL

- Postgres manually alter sequence

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

The only remaining difference: a `serial` column is also set to `NOT NULL`. You may or may not want that, too:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

But you cannot just alter the type of an existing `integer`:

ALTER TABLE scores ALTER job_id TYPE serial;

`serial` is not an actual data type. It's just a notational convenience feature for `CREATE TABLE`. In Postgres 10 or later consider an `IDENTITY` column instead:

- Auto increment table column

Problem

I am working on a Ruby on Rails app. We are using a PostgreSQL database. There is a table named `scores` with the following columns: ``` 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) ``` I need to add a sequence to `job_id` (note: there is no model for `job`). How do I create this sequence?

Original source

Related problems