Скинути автоматичний приріст лічильника в постгресах


232

Я хотів би примусити поле автоматичного збільшення таблиці до деякого значення, я спробував це:

ALTER TABLE product AUTO_INCREMENT = 1453

І

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

Я новачок у postgres :(

У мене є таблиця productз Idі nameполем


5
Якщо новий, чому б не використовувати pgAdmin та перевірити команди, які він буде генерувати?
Нерозумно

1
Зазвичай таблиці називають як "товари", а не як "продукт". У цьому випадку ваша послідовність буде названа як "products_id_seq". Будьте впевнені, що ви шукаєте правильну послідовність.
Олександр Горг

Відповіді:


309

Якщо ви створили таблицю productзі idстовпцем, послідовність називається не просто product, а скоріше product_id_seq(тобто ${table}_${column}_seq).

Це ALTER SEQUENCEпотрібна вам команда:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Ви можете побачити послідовності у вашій базі даних за допомогою \dsкоманди в psql. Якщо ви це зробите \d productі перегляньте обмеження для стовпця за замовчуванням, у nextval(...)виклику також буде вказано ім'я послідовності.


66
З цього повідомлення незрозуміло, що таке правильний синтаксис. Це: АЛЕ ПОСЛІДНОСТІ product_id_seq РЕСТАРТ З 1453;
Лірон Ягдав

7
Тільки тому, що я погано проаналізував вищезазначене, ось мій спосіб відновлення саме того самого. Синтаксис ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, де "seq" - це буквальний текст, і ви ставите число для #. Не нехтуйте підкресленнями. :-)
кморт

2
Зауважте, що якщо не використовується загальнодоступна схема, то потрібно встановити префікс my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Даніель Л. ВанДенБош

Хтось знає, чому ВІДПОВІДНО ПІДТРИМАТИ product_id_seq RESTART С (ВИБІР МАКС (id) з продукту); Не працює? Єдиний спосіб, який я знайшов, - це використовувати два окремі запити.
Кріс Хуан-Лівер

8
Зауважте, що значення, з яким ви перезапустите, - це наступне значення, яке ви хочете використовувати. Тож якщо у вас вже є запис з ідентифікатором 1453, ви повинні RESTART WITH 1454.
обіймає

144

Ось команда, яку ви шукаєте, припускаючи, що ваша послідовність таблиці продуктів є product_id_seq:

АЛЕ ПОСЛІДОВІ продукт_id_seq РЕСТАРТ З 1453;


130

Наступна команда робить це автоматично для вас: Це також видалить усі дані в таблиці. Тож будьте обережні.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Остерігайтеся - це також видалить усі ваші дані
kibibu

28
@Loolooii, просто позначивши його; якщо хтось незнайомий SQL шукає тут, оскільки він вручну додав рядок до таблиці з полем для самоврядування (наприклад, через ORM), то це рішення, ймовірно, не те, чого вони очікують.
kibibu

1
TABLEКлючове слово є зайвим. TRUNCATE someTable RESTART IDENTITY;достатньо.
user1

Будь-яка ідея, як би я це зробив з CASCADE?
ihossain

2
@ihossain ви пробували TRUNCATE someTable RESTART IDENTITY CASCADE;?
Ведран

55

Щоб встановити лічильник послідовностей:

setval('product_id_seq', 1453);

Якщо ви не знаєте ім'я послідовності, скористайтеся pg_get_serial_sequenceфункцією:

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

Параметри - це назва таблиці та назва стовпця.

Або просто видати \d productна psqlзапит:

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

14

- Зміна початкового значення послідовності

ALTER SEQUENCE project_id_seq RESTART 3000;

Те саме, але динамічно:

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

Я згоден, використання SELECT викликає занепокоєння, але воно працює.

Джерело: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Якщо я не помиляюся, PG представляє їх послідовності з last_value та is_called, починається з (1, false), тоді (1, true), (2, true) ... тому MAX (id) + 1 повинен бути MAX (id) замість цього, щоб не пропустити ідентифікатор.
Десять

Я також повинен був перезапустити свій екземпляр postgres, щоб це працювало. brew services restart postgresql
BigRon

SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Працює відмінно Але чи є спосіб відновити значення приросту до 0. Тож нові записи починаються з індексу 0?
Charith Jayasanka

13

Перетворено з коментаря заради зручності відвідувача

З цього повідомлення незрозуміло, що таке правильний синтаксис. Це є:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

якщо ви хочете скинути автоматичне збільшення з GUI, виконайте ці кроки.

  1. Перейдіть до своєї бази даних
  2. Клацніть на загальнодоступному
  3. на сторінці лістингу таблиць ви можете побачити таблички типу "Таблиці", "Перегляди", "Послідовності".
  4. Клацніть на Послідовності
  5. при натисканні на "Послідовності" ви побачите весь список послідовностей, натисніть на будь-який, який потрібно скинути
  6. Після цього ви можете побачити декілька варіантів на зразок "Alter", "Set Value", "Restart", "Reset" тощо ...
  7. потім натисніть кнопку Скинути , а потім додайте один новий рядок

6

Якщо у вас є таблиця зі стовпцем ІДЕНТИМНОСТІ, для якого потрібно скинути наступне значення, ви можете скористатись такою командою:

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

1
Один + для зручності використання у випадку відсутності sequenceабо ви НЕ МОЖЕТЕ усікати таблицю. Я думаю, що це найкраща відповідь
ABS

5

Щоб скинути автоматичний приріст, ви повинні отримати своє ім'я послідовності за допомогою наступного запиту.

Синтаксис:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Приклад:

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

Запит поверне ім'я послідовності autoid як "Demo_autoid_seq". Потім використовуйте наступний запит для скидання autoid

Синтаксис:

ALTER SEQUENCE sequenceName RESTART WITH value;

Приклад:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Щоб отримати ідентифікатор послідовності

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

Це дасть вам ідентифікатор послідовності як tableName_ColumnName_seq

Отримайте номер останнього насіння

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

або якщо ви знаєте, ідентифікатор послідовності вже використовує його безпосередньо.

select currval(tableName_ColumnName_seq);

Це дасть вам номер останнього насіння

Для скидання кількості використання насіння

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Використовуйте цей запит, щоб перевірити, що є послідовним ключем із схемою та таблицею,

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

Використовуйте значення цього збільшення запиту по черзі,

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

При вставці в таблицю наступне нарощене значення використовуватиметься як ключ (111).

Використовуйте цей запит, щоб встановити конкретне значення як збільшуване значення

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

При вставці в таблицю наступне нарощене значення використовуватиметься як ключ (121).


0

Зауважте, що якщо у вас є ім'я таблиці з "_", воно видаляється у назві послідовності.

Наприклад, назва таблиці: стовпець user_tokens: id Назва послідовності: usertokens_id_seq

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.