PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Creazione di una sequenza su una tabella esistente

Imposta il valore predefinito quando aggiungi la nuova colonna:

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');

La modifica del valore predefinito per le colonne esistenti non modifica i dati esistenti poiché il database non ha modo di sapere quali valori devono essere modificati; non c'è il flag "questa colonna ha il valore predefinito" sui valori delle colonne, c'è solo il valore predefinito (originariamente NULL poiché non hai specificato nient'altro) e il valore corrente (anche NULL) ma un modo per distinguere tra "NULL perché è l'impostazione predefinita" e "NULL perché è stato impostato esplicitamente su NULL". Quindi, quando lo fai in due passaggi:

  1. Aggiungi colonna.
  2. Cambia il valore predefinito.

PostgreSQL non applicherà il valore predefinito alla colonna che hai appena aggiunto. Tuttavia, se aggiungi la colonna e fornisci il valore predefinito allo stesso tempo, PostgreSQL saprà quali righe hanno il valore predefinito (tutte) quindi può fornire valori man mano che la colonna viene aggiunta.

A proposito, probabilmente vorrai anche un NOT NULL su quella colonna:

create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');

E, come a_horse_with_no_name note, se intendi utilizzare solo rid_seq per il tuo test.rid colonna quindi potresti voler impostare la sua colonna proprietario a test.rid in modo che la sequenza venga eliminata se la colonna viene rimossa:

alter sequence rid_seq owned by test.rid;