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


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.


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;


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;

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    | 

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


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;

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.

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>;

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;

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

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.