2011-11-03 15 views
5

Recentemente ho migrato un database da MySQL a PgSQL 9.PostgreSQL impostazione prossimo id di scrivere a

Ma ora quando cerco di creare un nuovo oggetto (in Django admin) mi dice che l'id sto cercando da usare (iniziato ad uno ed è aumentato ogni volta che ho provato) è già utilizzato.

Suppongo che sia presente un puntatore o un indice che deve essere impostato sull'ultimo ID utilizzato. Ho ragione?

+0

È possibile impostare il tipo di colonna su 'serial' e postgreSQL creerà automaticamente una sequenza. – Johan

+0

Sono quasi certo che lo sia, dal momento che il tavolo è stato creato da Django. – demux

+0

Ho trovato la risposta qui: http://stackoverflow.com/questions/1709705/postgresql-nextval-generating-existing-values ​​ – demux

risposta

7

Quando si definisce il vostro tavolo, il PostgreSQL equivalente a 'auto_increment' è:

CREATE TABLE foo (
    id SERIAL, 
    ... 
); 

Se è già stato creato il vostro tavolo (come ho il sospetto che sia), è possibile aggiungere manualmente:

CREATE SEQUENCE foo_id_seq; 
ALTER TABLE foo ALTER COLUMN id SET DEFAULT nextval('foo_id_seq'); 

si noti che se si vuole attaccare con il nome predefinito che Pg avrebbe dato si utilizzare il seguente formato per il nome della sequenza:

<table name>_<column name>_seq 

Nel mio esempio, foo_id_seq.

+0

C'era già una tabella e una sequenza creata da django. Quindi non ho dovuto creare la sequenza e alterare il tavolo. Ma ciò che ha funzionato è stato questo: selezionare setval ('uploads_id_seq', 6965); (carica essendo il nome del tavolo) – demux

2

Se la tabella è stata migrata e utilizza la serie seriale per sostituire la colonna di incremento automatico mysql, i dati probabilmente sono stati migrati senza incrementare la sequenza seriale. Cerca la funzione postgresql setval per impostare la sequenza su un valore superiore alla chiave esistente più alta nella tabella.

+0

L'ho trovato qui: http://www.postgresql.org/docs/current/static/functions-sequence.html Sono nuovo di postgresql; puoi mostrare un esempio? – demux

+0

'SELECT setval ('nameOfSequence', 42);' – Ketema

Problemi correlati