Risposte:
( Aggiornato - Grazie alle persone che hanno commentato )
Supponiamo di avere una tabella denominata test1
, alla quale si desidera aggiungere una id
colonna con chiave primaria (surrogata) ad incremento automatico . Il seguente comando dovrebbe essere sufficiente nelle versioni recenti di PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Nelle vecchie versioni di PostgreSQL (precedenti alla 8.x?) Dovevi 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 una volta, nelle recenti versioni di Postgres questo è approssimativamente equivalente al singolo comando sopra.
ADD PRIMARY KEY
crea anche un NOT NULL
vincolo (testato in Postgres 9.3) come previsto e desiderato.
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Questo è tutto ciò che serve per:
id
colonnaIl merito è dato a @resnyanskiy che ha dato questa risposta in un commento.
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Per utilizzare una colonna identità in v10,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
Per una spiegazione delle colonne di identità, consultare https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Per la differenza tra GENERATED BY DEFAULT e GENERATED SEMPRE, consultare 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/ .
SQL Error [23502]: ERROR: column "id" contains null values
Sono atterrato qui perché stavo cercando qualcosa del genere. Nel mio caso, stavo copiando i dati da una serie di tabelle di gestione temporanea con molte colonne in una tabella mentre assegnavo anche gli ID di riga alla tabella di destinazione. Ecco una variante degli approcci 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 esso nell'istruzione Inserisci. Quindi una semplice selezione * nella tabella di destinazione ha popolato 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;