Resetuj licznik automatycznego przyrostu w postgresie

232

Chciałbym zmusić pole automatycznego przyrostu tabeli do pewnej wartości, próbowałem z tym:

ALTER TABLE product AUTO_INCREMENT = 1453

I

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

Jestem nowy w postgresie :(

Mam tabeli productz Idi namepola

Rad
źródło
5
Jeśli nowy, dlaczego nie użyć pgAdmin i sprawdzić polecenia, które wygeneruje?
Nieuzasadniony
1
Zwykle tabele są nazywane jak „produkty”, a nie jak „produkt”. W tym przypadku twoja sekwencja zostanie nazwana jak „products_id_seq". Upewnij się, że szukasz prawidłowej sekwencji.
Alexander Gorg

Odpowiedzi:

309

Jeśli utworzyłeś tabelę productz idkolumną, sekwencja nie jest po prostu wywoływana product, ale raczej product_id_seq(to znaczy ${table}_${column}_seq).

Oto ALTER SEQUENCEpolecenie, którego potrzebujesz:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Możesz zobaczyć sekwencje w bazie danych za pomocą \dskomendy psql. Jeśli to zrobisz \d producti spojrzysz na domyślne ograniczenie dla kolumny, nextval(...)wywołanie określi również nazwę sekwencji.

araqnid
źródło
66
Z tego komunikatu nie wynika jasno, jaka jest poprawna składnia. Jest to: ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Liron Yahdav
7
Tylko dlatego, że źle przeanalizowałem powyższe, oto mój sposób na odtworzenie dokładnie tego samego. Składnia jest taka ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, gdzie „seq” to dosłowny tekst, a ty wstawisz liczbę dla #. Nie zaniedbuj podkreślników. :-)
kmort
2
Pamiętaj, że jeśli nie używasz schematu publicznego, konieczne jest przedrostek my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch
Czy ktoś wie, dlaczego ZMIENIĆ SEKWENCJĘ product_id_seq RESTART WITH (WYBIERZ MAX (id) z produktu); Nie działa? Jedynym sposobem, jaki znalazłem, jest użycie dwóch osobnych zapytań.
Chris Huang-Leaver,
8
Zauważ, że wartość, którą ponownie uruchomisz, jest następną wartością, której chcesz użyć. Więc jeśli masz już rekord z identyfikatorem 1453, powinieneś RESTART WITH 1454.
przytula
144

Oto polecenie, którego szukasz, zakładając, że sekwencją dla tabeli produktów jest id_produktu:

ZMIEŃ SEKWENCJĘ product_id_seq RESTART Z 1453;

matowy snajper
źródło
130

Następujące polecenie wykonuje to automatycznie: Spowoduje to również usunięcie wszystkich danych w tabeli. Więc uważaj.

TRUNCATE TABLE someTable RESTART IDENTITY;
Loolooii
źródło
21
Uwaga - spowoduje to również usunięcie wszystkich danych
kibibu
28
@Loolooii, po prostu zaznaczam; jeśli ktoś, kto nie zna SQL, szuka tutaj, ponieważ ręcznie dodał wiersz do tabeli z polem autoinkrementacji (na przykład poprzez ORM), to prawdopodobnie nie jest to oczekiwane rozwiązanie.
kibibu
1
Słowo TABLEkluczowe jest zbędne. TRUNCATE someTable RESTART IDENTITY;wystarczy.
użytkownik 1
Masz pomysł, jak to zrobić z CASCADE?
ihossain
2
@ihossain próbowałeś TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran
55

Aby ustawić licznik sekwencji:

setval('product_id_seq', 1453);

Jeśli nie znasz nazwy sekwencji, użyj pg_get_serial_sequencefunkcji:

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

Parametry to nazwa tabeli i nazwa kolumny.

Lub po prostu wydać \d productu psqlmonit:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 
Clodoaldo Neto
źródło
14

- Zmień wartość początkową sekwencji

ALTER SEQUENCE project_id_seq RESTART 3000;

To samo, ale dynamiczne:

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

Zgadzam się, że użycie SELECT jest niepokojące, ale działa.

Źródło: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment

Wiwwil
źródło
Jeśli się nie mylę, PG reprezentuje ich sekwencje z last_value i is_called, zaczyna się od (1, false), a następnie (1, true), (2, true) ... więc MAX (id) + 1 powinien być MAX (id) zamiast tego, aby nie pominąć identyfikatora.
10
Aby to zadziałało, musiałem zrestartować instancję postgres. brew services restart postgresql
BigRon
SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Działa idealnie Ale czy istnieje sposób, aby zresetować wartość przyrostu do 0. Więc nowe wpisy zaczynają się od indeksu 0?
Charith Jayasanka
13

Przekształcony z komentarza dla wygody gości

Z tego komunikatu nie wynika jasno, jaka jest poprawna składnia. To jest:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Anwar
źródło
6

jeśli chcesz zresetować automatyczny przyrost z GUI, wykonaj następujące kroki.

  1. Przejdź do swojej bazy danych
  2. Kliknij Publiczny
  3. na stronie z listami tabel możesz zobaczyć TABS takie jak „Tabele”, „Widoki”, „Sekwencje”.
  4. Kliknij Sekwencje
  5. kiedy klikniesz „Sekwencje”, zobaczysz całą listę sekwencji, kliknij dowolną, którą chcesz zresetować
  6. Następnie można wyświetlić wiele opcji, takich jak „Zmień”, „Ustaw wartość”, „Uruchom ponownie”, „Zresetuj” itp.
  7. następnie kliknij Resetuj , a następnie dodaj jeden Nowy wiersz.
Chaudhary
źródło
6

Jeśli masz tabelę z kolumną TOŻSAMOŚĆ, dla której chcesz zresetować następną wartość, możesz użyć następującego polecenia:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;
BrianB
źródło
1
Jeden + za użyteczność w przypadku braku sequencelub NIE możesz obciąć stołu. Myślę, że to najlepsza odpowiedź
ABS
5

Aby zresetować automatyczny przyrost, musisz uzyskać nazwę sekwencji za pomocą następującego zapytania.

Składnia:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Przykład:

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

Zapytanie zwróci nazwę sekwencji autoid jako „Demo_autoid_seq” Następnie użyj następującego zapytania, aby zresetować autoid

Składnia:

ALTER SEQUENCE sequenceName RESTART WITH value;

Przykład:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
Vinoth Shankar
źródło
3

Aby uzyskać identyfikator sekwencji, użyj

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

To da ci identyfikator sekwencyjny jako tableName_ColumnName_seq

Aby uzyskać ostatni numer nasion, użyj

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

lub jeśli znasz identyfikator sekwencji, użyj go bezpośrednio.

select currval(tableName_ColumnName_seq);

Daje ci ostatni numer nasion

Aby zresetować numer nasion, użyj

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
Raja A
źródło
1

Użyj tego zapytania, aby sprawdzić, co to jest klucz sekwencji ze schematem i tabelą,

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

Użyj tego zapytania, zwiększaj wartość przyrostu jeden po drugim,

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

Podczas wstawiania do tabeli jako klucz (111) używana będzie następna wartość przyrostowa.

Użyj tego zapytania, aby ustawić określoną wartość jako wartość przyrostową

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

Przy wstawianiu do tabeli jako klucz (121) będzie używana następna wartość przyrostowa.

Thushara Buddhika
źródło
0

Zauważ, że jeśli masz nazwę tabeli z „_”, jest ona usuwana w nazwie sekwencji.

Na przykład nazwa tabeli: user_tokens kolumna: id Nazwa sekwencji: usertokens_id_seq

abby
źródło