#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:
если вы хотите сбросить автоматическое приращение из графического интерфейса, выполните следующие действия.
- Перейдите в свою базу данных
- Нажмите на Public
- на странице со списком таблиц вы можете увидеть вкладки типа «Таблицы», «Представления», «Последовательности», подобные этому.
- Нажмите на последовательности
- когда вы нажимаете на «Последовательности», вы можете увидеть список всех последовательностей, нажмите на любую, которую вы хотите сбросить
- После этого вы можете увидеть несколько вариантов, таких как ‘Alter’, ‘Set Value’, ‘Restart’, ‘Reset’ и т.д…
- затем нажмите на Сброс, затем добавьте одну новую строку.
Ответ №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