Come spiegato nel documentation, SERIAL
non è un tipo di dati, ma una scorciatoia per una raccolta di altri comandi .
Così, mentre non si può cambiare semplicemente modificando il tipo, è possibile ottenere lo stesso effetto eseguendo questi altri soli comandi:
CREATE SEQUENCE temp_id_seq;
ALTER TABLE temp ALTER COLUMN id SET NOT NULL;
ALTER TABLE temp ALTER COLUMN id SET DEFAULT nextval('temp_id_seq');
ALTER SEQUENCE temp_id_seq OWNED BY temp.id;
Alterare il proprietario farà in modo che la sequenza è rimossa se il la tabella/colonna è caduta. Fornirà inoltre il comportamento previsto nella funzione pg_get_serial_sequence().
È necessario attenersi alla convenzione di denominazione tablename_columnname_seq
per convincere alcuni strumenti come pgAdmin a segnalare questo tipo di colonna come BIGSERIAL
. Si noti che psql e pg_dump mostreranno sempre la definizione sottostante, anche se la colonna è stata inizialmente dichiarata come un tipo SERIAL
.
fonte
2015-08-12 13:52:21
Si noti che questo * non * popolerà la colonna con i valori esistenti. Quindi l'aggiunta del vincolo 'PRIMARY KEY' fallirà se ci sono righe esistenti' NULL' o non univoche. (Si presume che l'utente non abbia già una chiave primaria. 'SERIAL' non è solo per un PK, e' SERIAL' non implica 'SERIAL PRIMARY KEY'). Inoltre, se la tabella ha righe esistenti, vorrai 'setval' la sequenza per assicurarti che inizi con il primo identificatore libero,' LOCK' la tabella per prima cosa per impedire 'INSERT' simultanei. –