Използвайте CREATE SEQUENCE
:
CREATE SEQUENCE scores_job_id_seq; -- = default name for plain a serial
След това добавете колона по подразбиране към scores.job_id
:
ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');
Ако искате да свържете последователността към колоната (така че се изтрива, когато колоната е изтрита), също изпълнете:
ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;
Всичко това може да бъде заменено с използване на псевдо тип данни serial
за колоната job_id
за начало:
- Безопасно и чисто преименувате таблици, които използват колони от сериен първичен ключ в Postgres?
Ако вашата таблица вече има редове, може да искате да зададете SEQUENCE
до следващата най-висока стойност и попълнете липсващите серийни стойности в таблицата:
SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;
По избор:
UPDATE scores
SET job_id = nextval('scores_job_id_seq')
WHERE job_id IS NULL;
- Как да проверите ефективно последователност за използвани и неизползвани стойности в PostgreSQL
- Postgres ръчно променя последователността
- Как да нулирате последователността на първичния ключ на postgres, когато не е синхронизирана?
Единствената останала разлика е serial
колоната също е настроена на NOT NULL
. Може и да не искате това:
ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
Но вие не можете просто променете типа на съществуващ integer
:
ALTER TABLE scores ALTER job_id TYPE serial;
serial
не е действителен тип данни. Това е просто удобна функция за нотации за CREATE TABLE
.
В Postgres 10 или по-нова версия помислете за IDENTITY
колона:
- Колона на таблицата с автоматично увеличение