2012-02-02 2 views
31

Ho la seguente tabella in Postgres:postgres autoincrement non aggiornato su esplicita id inserisce

CREATE TABLE "test" (
    "id" serial NOT NULL PRIMARY KEY, 
    "value" text 
) 

sto facendo seguenti inserimenti:

insert into test (id, value) values (1, 'alpha') 
insert into test (id, value) values (2, 'beta') 

insert into test (value) values ('gamma') 

Nei primi 2 inserti sto esplicitamente menzionare il id . Tuttavia il puntatore di incremento automatico della tabella non viene aggiornato in questo caso. Quindi nel terzo inserto ottengo l'errore:

ERROR: duplicate key value violates unique constraint "test_pkey" 
DETAIL: Key (id)=(1) already exists. 

non ho mai affrontato questo problema in Mysql in entrambi i motori MyISAM e InnoDB. Esplicito o no, mysql aggiorna sempre il puntatore autoincrement in base all'ID riga massima.

Qual è la soluzione alternativa a questo problema in Postgres? Ne ho bisogno perché voglio un controllo più stretto per alcuni ID nel mio tavolo.

UPDATE: Ho bisogno perché per alcuni valori ho bisogno di avere un id fisso. Per altre nuove voci non mi preoccupo di crearne di nuove.

ritengo sia possibile incrementando manualmente il puntatore nextval di max(id) + 1 ogni volta che inserisco esplicitamente i ids. Ma non sono sicuro di come farlo.

risposta

53

Ecco come dovrebbe funzionare: next_val('test_id_seq') viene chiamato solo quando il sistema richiede un valore per questa colonna e non ne è stato fornito uno. Se fornite un valore, non viene eseguita tale chiamata e di conseguenza la sequenza non viene "aggiornata".

Si potrebbe aggirare il problema manualmente setting il valore della sequenza dopo l'ultima inserto con valori esplicitamente previste:

SELECT setval('test_id_seq', (SELECT MAX(id) from "test")); 
+1

@ Grazie Milen-a-Radev +1, che ha fatto! – jerrymouse

+1

Strano comportamento. Vengo anche da MySQL. Grazie! –

+0

Mi sono imbattuto nello stesso problema e tra te e http://www.ruby-forum.com/topic/64428#72333 (in pratica dici la stessa cosa) hai risolto il problema. Grazie. – marsol0x