2010-05-31 18 views

risposta

195

(Aggiornato - Grazie alle persone che hanno commentato)

versioni moderne di PostgreSQL

Si supponga di avere una tabella denominata test1, a cui si desidera aggiungere un incremento automatico,-chiave primaria id (surrogato) colonna. Il seguente comando dovrebbe essere sufficiente in recenti versioni di PostgreSQL:

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

versioni precedenti di PostgreSQL

in vecchie versioni di PostgreSQL (prima 8.x?) Che si doveva fare tutto il lavoro sporco. La seguente sequenza di comandi dovrebbe fare il trucco:

ALTER TABLE test1 ADD COLUMN id INTEGER; 
    CREATE SEQUENCE test_id_seq OWNED BY test1.id; 
    ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq'); 
    UPDATE test1 SET id = nextval('test_id_seq'); 

Ancora, nelle versioni più recenti di questo Postgres è approssimativamente equivalente al singolo comando sopra.

+24

UPDATE test1 SET id = DEFAULT; funziona anche –

+3

Sto usando ORACLE, quindi la condivisione potrebbe essere utile per ORACLE ragazzi in ORACLE: ALTER TABLE TEST1 AGGIUNGI NUMERO ID; UPDATE TEST1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1 ADD PRIMARY KEY (ID); creare una sequenza TEST1_SEQ prima di eseguire l'istruzione UPDATE – msbyuva

+0

Nota che 'ADD PRIMARY KEY' crea anche un vincolo' NOT NULL' (testato in Postgres 9.3) come previsto e voluto. –

37
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

Questo è tutto ciò che serve a:

  1. aggiungere la colonna id
  2. popolarlo con una sequenza da 1 a contare (*).
  3. Impostarlo come chiave primaria/non null.

Il credito viene dato a @resnyanskiy che ha fornito questa risposta in un commento.

+2

Questo dovrebbe essere contrassegnato come risposta e la risposta dovrebbe appartenere a @resnyanskiy –

0

Sono atterrato qui perché stavo cercando qualcosa di simile. Nel mio caso, stavo copiando i dati da una serie di tabelle di staging con molte colonne in una tabella mentre assegnavo anche gli ID di riga alla tabella di destinazione. Ecco una variante degli approcci di cui sopra che ho usato. Ho aggiunto la colonna seriale alla fine della mia tabella di destinazione. In questo modo non devo avere un segnaposto per questo nell'istruzione Insert. Quindi una semplice selezione * nella tabella di destinazione riempie automaticamente questa colonna. Ecco le due istruzioni SQL che ho usato su PostgreSQL 9.6.4.

ALTER TABLE target ADD COLUMN some_column SERIAL; 
INSERT INTO target SELECT * from source; 
0

Per utilizzare una colonna di identità in v10,

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint} 
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY; 

Per la spiegazione di colonne Identity, vedere https://blog.2ndquadrant.com/postgresql-10-identity-columns/.

Per la differenza tra GENERATO PER DEFAULT e SEMPRE GENERATO, vedere https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/.

Per modificare la sequenza, vedere https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/.

+0

Il problema con questa soluzione è che se la tabella contiene già righe, si ottiene un errore: 'Errore SQL [23502]: ERRORE: la colonna" id "contiene valori nulli' – isapir

Problemi correlati