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

#sql #postgresql #reset #auto-increment

#sql #postgresql #Сброс #автоматическое увеличение

Вопрос:

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

 ALTER TABLE product AUTO_INCREMENT = 1453
  

И

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

У меня есть таблица product с Id полем и name

Комментарии:

1. Если новый, почему бы не использовать pgAdmin и не проверить команды, которые он будет генерировать?

2. Обычно таблицы называются как «продукты», а не как «product». В этом случае ваша последовательность будет называться как «products_id_seq». Убедитесь, что вы ищете правильную последовательность.

Ответ №1:

Если вы создали таблицу product со id столбцом, то последовательность вызывается не просто product , а скорее product_id_seq (то есть ${table}_${column}_seq ).

Это ALTER SEQUENCE команда, которая вам нужна:

 ALTER SEQUENCE product_id_seq RESTART WITH 1453
  

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

Комментарии:

1. Из этого сообщения неясно, каков правильный синтаксис. Это: ИЗМЕНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ product_id_seq, ПЕРЕЗАПУСТИТЬ С 1453;

2. Просто потому, что я плохо разобрал вышесказанное, вот мой способ повторить то же самое. Синтаксис такой ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH # , где «seq» — это буквенный текст, и вы вводите число для #. Не пренебрегайте подчеркиванием. 🙂

3. Пожалуйста, обратите внимание, что если не используется общедоступная схема, необходимо указать префикс my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453

4. Обратите внимание, что значение, с которым вы перезапускаете, является следующим значением, которое вы хотите использовать. Итак, если у вас уже есть запись с идентификатором 1453 , вам следует RESTART WITH 1454 .

5. с IDENTITY ограничениями столбцов вы делаете ALTER TABLE tbl ALTER COLUMN id RESTART SET START 1453

Ответ №2:

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

 TRUNCATE TABLE someTable RESTART IDENTITY;
  

Комментарии:

1. Будьте осторожны — это также приведет к удалению всех ваших данных

2. @Loolooii, просто отмечаю это; если кто-то, незнакомый с SQL, ищет здесь, потому что он вручную добавил строку в таблицу с полем автоматического увеличения (например, через ORM), то это решение, вероятно, не то, что они ожидают.

3. TABLE Ключевое слово является избыточным. TRUNCATE someTable RESTART IDENTITY; этого достаточно.

4. @ihossain ты пробовал TRUNCATE someTable RESTART IDENTITY CASCADE; ?

5. Для таблиц, на которые ссылаются, вы можете сделать TRUNCATE table2, table1 RESTART IDENTITY;

Ответ №3:

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

 ALTER SEQUENCE product_id_seq RESTART WITH 1453;
  

Ответ №4:

Чтобы установить счетчик последовательности:

 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    | 
  

Комментарии:

1. ВЫБЕРИТЕ setval(‘product_id_seq’, 1453); сработало для меня

2. Я пытаюсь выбрать pg_get_serial_sequence(‘Domain.products’, ‘id’); но жалуется, что схема не существует. Как я могу выполнить этот запрос? Я новичок в psql.

Ответ №5:

 -- Change the starting value of the sequence

ALTER SEQUENCE project_id_seq RESTART 3000;
  

То же самое, но динамическое :

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

Использование SELECT странно, но это работает.

Источник: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment

Редактировать: удалено 1 , как предложено в комментариях

Комментарии:

1. Если я не ошибаюсь, PG представляет свои последовательности с помощью last_value и is_called, начинается с (1, false), затем (1, true), (2, true)… таким образом, MAX (id) 1 должно быть MAX (id) вместо этого, чтобы не пропустить идентификатор.

2. Мне также пришлось перезапустить мой экземпляр postgres, чтобы это заработало. brew services restart postgresql

3. ВЫБЕРИТЕ SETVAL(‘project_id_seq’, (ВЫБЕРИТЕ MAX (id) 1 ИЗ project)); Работает отлично, но есть ли способ сбросить значение приращения до 0. Значит, новые записи начинаются с индекса 0?

4. Добавлять не нужно 1 , просто используйте MAX(column_name) . Если вы добавите 1 , значение в последовательности будет пропущено.

Ответ №6:

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

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

Комментарии:

1. Один для удобства использования в случае, если нет sequence или вы НЕ можете усечь таблицу. Я думаю, что это лучший ответ

Ответ №7:

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

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

 ALTER SEQUENCE product_id_seq RESTART WITH 1453;
  

Ответ №8:

Чтобы установить его на следующее по величине значение, вы можете использовать:

 SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));
  

Комментарии:

1. Самый полезный ответ. Спасибо!

2. Это подходит мне лучше всего. Однако не забудьте добавить 1 к max(). Это: SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) 1 FROM table_name));

3. Добавлять не нужно 1 , просто используйте MAX(column_name) . Если вы добавите 1 , значение в последовательности будет пропущено.

Ответ №9:

2021 год, Postgres 11.12

ИЗМЕНЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ у меня не сработало, оно каким-то образом сбрасывает его на null. Что сработало для меня, так это:

 SELECT setval('<table>_<column>_seq', 5);
  

Комментарии:

1. у меня это тоже сработало с Postgres 12.8, спасибо

Ответ №10:

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

  1. Перейдите в свою базу данных
  2. Нажмите на Public
  3. на странице со списком таблиц вы можете увидеть вкладки типа «Таблицы», «Представления», «Последовательности», подобные этому.
  4. Нажмите на последовательности
  5. когда вы нажимаете на «Последовательности», вы можете увидеть список всех последовательностей, нажмите на любую, которую вы хотите сбросить
  6. После этого вы можете увидеть несколько вариантов, таких как ‘Alter’, ‘Set Value’, ‘Restart’, ‘Reset’ и т.д…
  7. затем нажмите на Сброс, затем добавьте одну новую строку.

Ответ №11:

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

Синтаксис:

 SELECT pg_get_serial_sequence(‘tablename’, ‘ columnname‘);
  

Пример:

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

Запрос вернет имя последовательности autoid как «Demo_autoid_seq»
Затем используйте следующий запрос для сброса автоматического ввода

Синтаксис:

 ALTER SEQUENCE sequenceName RESTART WITH value;
  

Пример:

 ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
  

Ответ №12:

Чтобы получить идентификатор последовательности, используйте

 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
  

Ответ №13:

Используйте этот запрос, чтобы проверить, каков ключ последовательности в схеме и таблице,

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

Используйте этот запрос, чтобы увеличивать значение приращения одно за другим,

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

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

Используйте этот запрос, чтобы установить определенное значение в качестве увеличиваемого значения

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

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

Комментарии:

1. Спасибо, что указали, как получить seqName для другой схемы 🙂

Ответ №14:

Если таблица похожа

 bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 0)
  

После вставки некоторых записей в диапазон 0-9 , вызовет конфликт для next insert , поэтому для сброса запуска:

 ALTER TABLE ... ALTER COLUMN ... RESTART WITH 10;
  

Ответ №15:

Я не уверен во всех приведенных выше ответах, что, если у меня нет имени последовательности? Что, если я не хочу усекать свою таблицу?

Приведенный ниже запрос помог мне сделать это, не затрагивая существующие данные.

 ALTER TABLE <<table_name>>
    ALTER COLUMN <<primary_key_column_name>> RESTART SET START 4044;
  

Ответ №16:

Обратите внимание, что если у вас есть имя таблицы с ‘_’, оно удаляется в имени последовательности.

Например, имя таблицы: user_tokens столбец: имя последовательности идентификаторов: usertokens_id_seq

Комментарии:

1. Для меня это не так. У меня то же условие, но подчеркивание сохраняется в имени последовательности name

Ответ №17:

Скрипт узла: Исправьте идентификатор всех таблиц: автоматическое увеличение / nextval на основе последнего вставленного.

 const pg = require('pg');
const { Client } = pg;

const updateTables = async () => {

  const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'my-database',
    password: 'postgres',
    port: 5432,
  });

  await client.connect();

  console.log('Connected');

  const execQuery = async (queryStr, params = []) => {
    return new Promise((resolve, reject) => {
      client.query(queryStr, params, (error, results) => {
        if (error) {
          reject(error);
        } else {
          resolve(results);
        }
      })
    })
  }

  const tablesRes = await execQuery(`
    SELECT table_name
    FROM information_schema.tables
    WHERE table_type='BASE TABLE'
    AND table_schema='public';
  `)

  const tables = tablesRes.rows.map(row => row.table_name);

  tables.map(async tableName => {
    let lastId;
    try {
      const res = await execQuery(`SELECT id from "${tableName}" ORDER BY id DESC LIMIT 1`);
      lastId = res.rows[0].id;
    } catch (e) {}

    if (lastId) {
      const nextId = lastId   1;
      const queryStr = `ALTER SEQUENCE ${tableName}_id_seq RESTART WITH ${nextId}`;
      await execQuery(queryStr);
      console.log(tableName, queryStr);
    }
  })

};

updateTables();
  

Ответ №18:

 ALTER SEQUENCE public."Table_Id_seq"
RESTART 50;
  

этот запрос сработал для меня. Postgresql версии 14