impostare il valore predefinito quando si aggiunge la nuova colonna:
create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');
Alterare il valore predefinito per le colonne esistenti non cambia i dati esistenti in quanto il database non ha alcun modo di sapere quali valori dovrebbero essere modificati ; non c'è il flag "this column has the default value" sui valori delle colonne, c'è solo il valore predefinito (originariamente NULL poiché non hai specificato altro) e il valore corrente (anche NULL) ma il modo per dire la differenza tra "NULL perché è il valore predefinito "e" NULL perché è stato impostato esplicitamente su NULL ". Quindi, quando lo fai in due passaggi:
- Aggiungi colonna.
- Modificare il valore predefinito.
PostgreSQL non applica il valore predefinito alla colonna appena aggiunta. Tuttavia, se si aggiunge la colonna e si fornisce il valore predefinito allo stesso tempo, PostgreSQL sa quali righe hanno il valore predefinito (tutte) in modo che possa fornire valori man mano che la colonna viene aggiunta.
Tra l'altro, probabilmente desidera un NOT NULL su quella colonna troppo:
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 si intende utilizzare solo rid_seq
per la colonna test.rid
allora si potrebbe desiderare di set its owner column a test.rid
modo che la sequenza viene interrotta se la colonna viene rimossa:
alter sequence rid_seq owned by test.rid;
fonte
2012-02-26 22:57:30
Grazie per il frammento. Sto cercando errori di sintassi quando cerco di eseguirlo: 'at or near @'. Non ho familiarità con la definizione delle variabili in Postgreqsl, quindi non sono sicuro se c'è qualcosa di ovvio che devo cambiare. – djq
(1) Che assomiglia a SQL Server o forse sintassi MySQL, non funzionerà in PostgreSQL. (2) Ciò causerà qualche problema non appena vengono aggiunte nuove righe in quanto non si stanno usando i valori della sequenza, il valore successivo che esce dalla sequenza sarà 1 anche se l'hai già usato per un ' RID. –
Buona cattura, [mu è troppo corto] (http://stackoverflow.com/users/479863/mu-is-too-short), su come non usare i valori della sequenza. E sì, sono abbastanza bravo a scrivere codice MS SQL Server (con il quale avrei affrontato un po 'diversamente) e non ho affatto familiarità con PostgreSQL.Il punto che stavo tentando di fare era la differenza tra la definizione di un vincolo e l'applicazione, che la risposta upvoted spiega meglio di I. –