2010-09-29 13 views
38

Esiste un modo per reimpostare la chiave primaria di una tabella PostgreSQL per iniziare nuovamente su 1 su una tabella popolata?Reimposta la chiave primaria di PostgreSQL su 1

In questo momento sta generando numeri da 1000000 in su. Voglio che tutto resetti e inizi a 1, mantenendo intatti tutti i miei dati esistenti.

risposta

23

I tasti primari che l'autoincremento (ovvero le colonne con tipo di dati serial primary key) sono associati a sequence. È possibile impostare il valore successivo per qualsiasi sequenza usando setval(<seqname>,<next_value>).

Il nome delle sequenze auto creato quando si utilizza di serie sono <table>_<column>_seq

+9

È necessario mettere "SELECT" davanti alla chiamata, ad esempio, 'SELECT setval ('table_id_seq', 10000)' – Tom

+1

Se si esegue 'SELECT setval ('table_id_seq', 1)', quando inserisco un nuovo registra che l'id ha valore 2, anziché 1. [la soluzione di Paweł Gościcki] (http://stackoverflow.com/a/5272164/505893) funziona. (PostgreSQL 9.3) – bluish

+0

@bluish Presumibilmente, ciò che è successo è che il numero di sequenza viene incrementato prima che venga assegnata una nuova chiave primaria, ad es. avresti bisogno di resettarlo a 0. Ma sono d'accordo che l'altra soluzione sia comunque migliore. – kralyk

96

Il modo migliore per ripristinare una sequenza di iniziare di nuovo con il numero 1 è quello di eseguire il seguente:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1 

Così, per esempio per la tabella users sarebbe:

ALTER SEQUENCE users_id_seq RESTART WITH 1 
+8

Il parametro 'WITH 1' è ridondante e può essere ommited –

0

@bluish effettivamente l'inserimento di un nuovo record utilizzando una chiave primaria auto incrementale, è jus t come l'utilizzo di una sequenza in modo esplicito in questo modo:

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...) 

Quindi, se si desidera che il primo ID per essere 1, si dovrebbe avere per impostare la sequenza a 0. Ma è fuori dai limiti, quindi è necessario utilizzare l'ALTER Dichiarazione SEQUECE. Quindi, se si dispone di un campo seriale denominato numero nel vostro menu Tabella, per exemple:

ALTER SEQUENCE menu_number_seq RESTART 

farà il lavoro perfettamente.

Problemi correlati