Ripristina contatore di incrementi automatici in postgres


232

Vorrei forzare il campo di incremento automatico di una tabella su un valore, ho provato con questo:

ALTER TABLE product AUTO_INCREMENT = 1453

E

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Sono nuovo di Postgres :(

Ho un tavolo productcon Ide namecampo


5
Se nuovo, perché non usare pgAdmin e ispezionare i comandi che genererà?
Unreason

1
Di solito le tabelle sono denominate "prodotti" e non come un "prodotto". In questo caso la sequenza verrà denominata come "products_id_seq". Assicurati di cercare una sequenza corretta.
Alexander Gorg,

Risposte:


309

Se hai creato la tabella productcon una idcolonna, la sequenza non viene semplicemente chiamata product, ma piuttosto product_id_seq(cioè ${table}_${column}_seq).

Questo è il ALTER SEQUENCEcomando che ti serve:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Puoi vedere le sequenze nel tuo database usando il \dscomando in psql. Se lo fai \d producte osservi il vincolo predefinito per la tua colonna, la nextval(...)chiamata specificherà anche il nome della sequenza.


66
Da questo messaggio non è chiaro quale sia la sintassi corretta. È: ALTER SEQUENCE product_id_seq RIAVVIA CON 1453;
Liron Yahdav,

7
Solo perché ho analizzato male quanto sopra, ecco il mio modo di riaffermare esattamente la stessa cosa. La sintassi è ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, dove "seq" è il testo letterale e si inserisce un numero per #. Non trascurare i caratteri di sottolineatura. :-)
kmort

2
Si noti che se non si utilizza lo schema pubblico è necessario aggiungere il prefisso my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch,

Qualcuno sa perché ALTER SEQUENCE product_id_seq RIAVVIA CON (SELEZIONA MAX (id) dal prodotto); Non funziona? L'unico modo che ho trovato è usare due query separate.
Chris Huang-Leaver,

8
Si noti che il valore con cui si riavvia è il valore successivo che si desidera utilizzare. Quindi, se hai già un record con ID 1453, dovresti RESTART WITH 1454.
hughes

144

Ecco il comando che stai cercando, supponendo che la sequenza per la tabella del prodotto sia product_id_seq:

ALTER SEQUENCE product_id_seq RIAVVIA CON 1453;


130

Il seguente comando lo fa automaticamente per te: questo eliminerà anche tutti i dati nella tabella. Perciò stai attento.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Attenzione - questo cancellerà anche tutti i tuoi dati
kibibu

28
@Loolooii, basta segnalarlo; se qualcuno che non ha familiarità con SQL sta cercando qui perché ha aggiunto manualmente una riga a una tabella con un campo di incremento automatico (tramite un ORM, ad esempio), probabilmente questa soluzione non è quella che si aspettano.
Kibibu,

1
La TABLEparola chiave è ridondante. TRUNCATE someTable RESTART IDENTITY;è abbastanza.
user1

Hai idea di come lo farei con CASCADE?
ihossain,

2
@ihossain hai provato TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran,

55

Per impostare il contatore sequenze:

setval('product_id_seq', 1453);

Se non conosci il nome della sequenza usa la pg_get_serial_sequencefunzione:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

I parametri sono il nome della tabella e il nome della colonna.

O semplicemente emetti un messaggio \d productal psqlprompt:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- Modifica il valore iniziale della sequenza

ALTER SEQUENCE project_id_seq RESTART 3000;

Stesso ma dinamico:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Sono d'accordo che l'uso di un SELECT è inquietante ma funziona.

Fonte: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Se non sbaglio, PG rappresenta le loro sequenze con last_value e is_called, inizia da (1, false), quindi (1, true), (2, true) ... quindi MAX (id) + 1 dovrebbe essere MAX (id) invece di non saltare un id.
Dieci

Ho anche dovuto riavviare la mia istanza di Postgres perché questo funzionasse. brew services restart postgresql
BigRon

SELEZIONA SETVAL ('project_id_seq', (SELEZIONA MAX (id) + 1 DA progetto)); Funziona perfettamente Ma c'è un modo per ripristinare il valore di incremento su 0. Quindi le nuove voci iniziano con un indice 0?
Charith Jayasanka,

13

Convertito da un commento per comodità del visitatore

Da questo messaggio non è chiaro quale sia la sintassi corretta. È:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

se si desidera ripristinare l'incremento automatico dalla GUI, attenersi alla seguente procedura.

  1. Vai al tuo database
  2. Clicca su Pubblico
  3. nella tabella Elenco delle pagine puoi vedere TAB come "Tabelle", "Viste", "Sequenze" simili.
  4. Fai clic su Sequenze
  5. quando si fa clic su "Sequenze" è possibile visualizzare tutti gli elenchi delle sequenze, fare clic su quelli che si desidera ripristinare
  6. Dopodiché puoi vedere una scelta multipla come 'Alter', 'Set Value', 'Restart', 'Reset' ecc ...
  7. quindi fare clic su Ripristina , quindi aggiungere una nuova riga.

6

Se si dispone di una tabella con una colonna IDENTITY per cui si desidera reimpostare il valore successivo, è possibile utilizzare il comando seguente:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
One + per usabilità in caso di no sequenceo NON è possibile troncare la tabella. Penso che sia la risposta migliore
ABS

5

Per ripristinare l'incremento automatico è necessario ottenere il nome della sequenza utilizzando la seguente query.

Sintassi:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Esempio:

SELECT pg_get_serial_sequence('demo', 'autoid');

La query restituirà il nome della sequenza di autoid come "Demo_autoid_seq" Quindi utilizzare la query seguente per ripristinare l'autoid

Sintassi:

ALTER SEQUENCE sequenceName RESTART WITH value;

Esempio:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Per ottenere l'id sequenza utilizzare

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Questo ti darà l'ID sequenza come tableName_ColumnName_seq

Per ottenere l'ultimo numero seme utilizzare

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

o se conosci l'ID sequenza lo usi già direttamente.

select currval(tableName_ColumnName_seq);

Ti darà l'ultimo numero di seme

Per ripristinare il numero seme utilizzare

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Utilizzare questa query per verificare qual è la chiave di sequenza con schema e tabella,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Utilizzare questa query per aumentare il valore dell'incremento uno per uno,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Quando si inserisce nella tabella, il valore incrementato successivo verrà utilizzato come chiave (111).

Utilizzare questa query per impostare un valore specifico come valore incrementato

SELECT setval('"SchemaName"."SequenceKey"', 120);

Quando si inserisce nella tabella, il valore incrementato successivo verrà utilizzato come chiave (121).


0

Nota che se hai un nome di tabella con '_', viene rimosso nel nome della sequenza.

Ad esempio, nome tabella: colonna user_tokens: id Nome sequenza: usertokens_id_seq

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.