Ho una tabella con dati esistenti. C'è un modo per aggiungere una chiave primaria senza cancellare e ricreare la tabella?Come aggiungere una chiave primaria a incremento automatico a una tabella esistente, in PostgreSQL?
Come aggiungere una chiave primaria a incremento automatico a una tabella esistente, in PostgreSQL?
risposta
(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.
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Questo è tutto ciò che serve a:
- aggiungere la colonna
id
- popolarlo con una sequenza da 1 a contare (*).
- Impostarlo come chiave primaria/non null.
Il credito viene dato a @resnyanskiy che ha fornito questa risposta in un commento.
Questo dovrebbe essere contrassegnato come risposta e la risposta dovrebbe appartenere a @resnyanskiy –
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;
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/.
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
- 1. C'è qualche vantaggio nell'avere una chiave primaria a incremento automatico in una tabella pivot MySQL?
- 2. come aggiungere una chiave primaria a una tabella nei binari
- 3. Inserire una chiave primaria con incremento automatico in una tabella di accesso
- 4. Aggiungere la chiave primaria alla tabella esistente
- 5. come aggiungere una nuova colonna alla chiave primaria composita esistente
- 6. SQL - molti-a-molti tabella primaria chiave
- 7. Perché utilizzare una chiave primaria a incremento automatico quando esistono altri campi univoci?
- 8. Aggiunta di chiave primaria a una tabella MySQL esistente in alambicco
- 9. Come applicare la funzione UNLOGGED PostgreSQL a una tabella esistente?
- 10. Aggiungi incremento automatico alla colonna chiave primaria in Rails
- 11. Modello Django Incremento automatico Chiave primaria basata su chiave esterna
- 12. SQLAlchemy Ottieni chiave primaria con incremento automatico prima dell'impegno
- 13. Come impostare la chiave primaria con incremento automatico in MongoDB?
- 14. Chiave primaria con incremento automatico nelle tabelle SQL
- 15. mysql, modifica colonna rimuovi chiave primaria e incremento automatico
- 16. Proprietà incremento automatico non chiave
- 17. SQL Server: arbitraria di incremento automatico della chiave primaria
- 18. Campo di incremento automatico di Django BigInteger come chiave primaria?
- 19. Aggiungere una nuova coppia di valori chiave a Firebase esistente
- 20. Come posso aggiungere un INDICE con Doctrine 2 a una colonna senza renderlo una chiave primaria?
- 21. Aggiungere la colonna di dati a una tabella mySQL esistente
- 22. SQLSERVER: Come modificare una chiave primaria int della tabella esistente per diventare una colonna Identity?
- 23. Come aggiungere una colonna di sequenza a una tabella esistente con record
- 24. Come rendere tabella MySQL incremento automatico della chiave primaria con un certo prefisso
- 25. Come aggiungere un'associazione EF6 a una chiave candidata/chiave univoca che non è la chiave primaria?
- 26. Come posso aggiungere a una tabella in Lua
- 27. Incremento automatico per Oracle
- 28. Come si aggiorna una tabella con una chiave esterna a un'altra tabella in ADO.Net Entity Model?
- 29. Creare una nuova tabella e aggiungere una chiave primaria utilizzando SELECT INTO
- 30. tabella non dispone di una chiave primaria
UPDATE test1 SET id = DEFAULT; funziona anche –
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
Nota che 'ADD PRIMARY KEY' crea anche un vincolo' NOT NULL' (testato in Postgres 9.3) come previsto e voluto. –