2012-02-02 11 views
31

Mam poniższej tabeli w PostgreSQL:postgres AutoIncrement nie są aktualizowane na wyraźną id wstawia

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

robie następujące wstawki:

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

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

w pierwszych 2 wkładkami ja wyraźnie podając identyfikator . Jednak wskaźnik automatycznego przyrostu tabeli nie jest w tym przypadku aktualizowany. Stąd w 3 wkładki pojawia się błąd:

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

nigdy w obliczu tego problemu w MySQL w obu silnikach MyISAM i InnoDB. Jawny czy nie, mysql zawsze aktualizuje wskaźnik autoinkrecji oparty na max id-wiersza.

Jakie jest obejście tego problemu w postgresie? Potrzebuję go, ponieważ chcę ściślejszej kontroli dla niektórych identyfikatorów w moim stole.

AKTUALIZACJA: Potrzebuję go, ponieważ w przypadku niektórych wartości muszę mieć stały identyfikator. W przypadku innych nowych wpisów nie mam nic przeciwko tworzeniu nowych.

myślę, że może to być możliwe dzięki ręcznie zwiększając wskaźnik nextval do max(id) + 1 gdy jestem jawnie wstawianie identyfikatory. Ale nie jestem pewien, jak to zrobić.

Odpowiedz

53

Tak to powinno działać - next_val('test_id_seq') jest wywoływane tylko wtedy, gdy system potrzebuje wartości dla tej kolumny, a użytkownik jej nie podał. Jeśli podasz wartość, nie zostanie wykonane takie wywołanie, a sekwencja nie zostanie "zaktualizowana".

Można to obejść poprzez ręczne setting wartość sekwencji po ostatnim wkładką z wyraźnie określonych wartości:

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

@ Milen-a-Radev +1, dzięki, że to zrobił! – jerrymouse

+1

Dziwne zachowanie. Pochodzę również z MySQL. Dziękuję Ci! –

+0

Wpadłem na ten sam problem i między tobą a http://www.ruby-forum.com/topic/64428#72333 (w zasadzie mówisz to samo) rozwiązałeś mój problem. Dzięki. – marsol0x

Powiązane problemy