Сброс счетчика автоматического приращения в postgres

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поля

Rad
источник
5
Если новенький, почему бы не использовать pgAdmin и проверить команды, которые он будет генерировать?
Unreason
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(...)вызов также определит имя последовательности.

araqnid
источник
66
Из этого сообщения не ясно, каков правильный синтаксис. Это: ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Лирон Яхдав
7
Просто потому, что я плохо разбирал вышесказанное, вот мой способ пересказать то же самое. Синтаксис ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, где "seq" - это буквальный текст, и вы вводите число для #. Не пренебрегайте подчеркиванием. :-)
kmort
2
Обратите внимание, что если не используется общедоступная схема, необходимо использовать префикс my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Даниэль Л. ВанДенБош
Кто-нибудь знает почему ALTER SEQUENCE product_id_seq RESTART WITH (ВЫБРАТЬ МАКС (id) из продукта); Не работает? Единственный способ, который я нашел, - это использовать два отдельных запроса.
Крис Хуан-Ливер
8
Обратите внимание, что значение, с которого вы перезапускаете, является следующим значением, которое вы хотите использовать. Так что если у вас уже есть запись с идентификатором 1453, вы должны RESTART WITH 1454.
Хью
144

Вот команда, которую вы ищете, предполагая, что ваша последовательность для таблицы product is product_id_seq:

ALTER SEQUENCE product_id_seq ПЕРЕЗАГРУЗИТЬ С 1453;

Мэтт Снайдер
источник
131

Следующая команда делает это автоматически для вас: Это также удалит все данные в таблице. Так что будьте осторожны.

TRUNCATE TABLE someTable RESTART IDENTITY;
Loolooii
источник
21
Осторожно - это также удалит все ваши данные
kibibu
28
@Loolooii, просто пометить его; если кто-то незнакомый с SQL ищет здесь, потому что он вручную добавил строку в таблицу с полем автоинкремента (например, через ORM), то это решение, вероятно, не то, что он ожидает.
кибибу
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

Wiwwil
источник
Если я не ошибаюсь, PG представляет их последовательности с last_value и is_called, начинается с (1, false), затем (1, true), (2, true) ... поэтому MAX (id) + 1 должно быть MAX (id) вместо этого, чтобы не пропускать id.
десять
Мне также пришлось перезапустить мой экземпляр postgres, чтобы это работало. brew services restart postgresql
BigRon
SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 ОТ проекта)); Работает отлично Но есть ли способ сбросить значение приращения до 0. Итак, новые записи начинаются с индекса 0?
Чарит Джаясанка
13

Конвертировано из комментария для удобства посетителей

Из этого сообщения не ясно, каков правильный синтаксис. Это:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Анвар
источник
6

если вы хотите сбросить автоинкремент из графического интерфейса, выполните следующие действия.

  1. Перейти к вашей базе данных
  2. Нажмите на общедоступный
  3. на странице списка таблиц вы можете видеть TABS, такие как «Таблицы», «Представления», «Последовательности» и тому подобное.
  4. Нажмите на последовательности
  5. Когда вы нажимаете «Последовательности», вы можете увидеть все списки последовательностей, нажмите на любой, который вы хотите сбросить
  6. После этого вы можете увидеть несколько вариантов, таких как «Изменить», «Установить значение», «Перезагрузить», «Сброс» и т. Д.
  7. затем нажмите Reset , затем добавьте одну новую строку.
Чаудхари
источник
6

Если у вас есть таблица со столбцом IDENTITY, для которой вы хотите сбросить следующее значение, вы можете использовать следующую команду:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;
BrianB
источник
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

Abby
источник