У меня есть таблица с более чем миллионом строк. Мне нужно сбросить последовательность и переназначить столбец идентификатора новыми значениями (1, 2, 3, 4 ... и т. Д.). Есть какой-нибудь простой способ сделать это?
postgresql
sequence
Сеннин
источник
источник
id
это не началось с 1. Таким образом, порядок получился следующим: 150, 151 ..., 300, 1, 2 ... И, я полагаю, в конечном итоге это привело бы к ошибкам дублирования идентификаторов, если бы я не перенумеровал идентификаторы. Кроме того, заказ поid
обычно лучше, чем заказ поcreated_at
. И вот что сработало для меня .Ответы:
Если вы не хотите сохранять порядок идентификаторов, вы можете
Я сомневаюсь, что есть простой способ сделать это в выбранном вами порядке, не воссоздавая всю таблицу.
источник
ALTER SEQUENCE seq RESTART WITH 1;
?SELECT setval('seq', 1, FALSE)
должен делать то же самое (здесь третий аргумент, ЛОЖЬ, творит чудеса, так как он показывает, чтоnextval
должно быть 1 вместо 2)В PostgreSQL 8.4 или новее больше не нужно указывать
WITH 1
. Будет использовано начальное значение, которое было записаноCREATE SEQUENCE
или установлено последнимALTER SEQUENCE START WITH
(скорее всего, это будет 1).Сбросьте последовательность:
Затем обновите столбец идентификатора таблицы:
Источник: PostgreSQL Docs
источник
Сбросьте последовательность:
Обновление текущих записей:
источник
serial
иCREATE SEQUENCE
равно 1!)Оба предоставленных решения не сработали для меня;
setval('seq', 1)
начинает нумерацию с 2, а такжеALTER SEQUENCE seq START 1
начинает нумерацию с 2, потому что seq.is_called истинно (Postgres версии 9.0.4)Решение, которое сработало для меня:
источник
Просто для упрощения и пояснения правильного использования ALTER SEQUENCE и SELECT setval для сброса последовательности:
эквивалентно
Любой из операторов может использоваться для сброса последовательности, и вы можете получить следующее значение с помощью nextval ('sequence_name'), как указано здесь :
источник
Лучший способ сбросить последовательность, чтобы начать с номера 1, - выполнить следующее:
Так, например, для таблицы пользователей это будет:
источник
Чтобы сохранить порядок строк:
источник
К вашему сведению: если вам нужно указать новое начальное значение между диапазоном идентификаторов (например, 256 - 10000000):
источник
Простой сброс последовательности и обновление всех строк может вызвать повторяющиеся ошибки идентификатора. Во многих случаях вам нужно обновить все строки дважды. Сначала с более высокими идентификаторами, чтобы избежать дублирования, затем с идентификаторами, которые вам действительно нужны.
Не добавляйте фиксированную сумму ко всем идентификаторам (как рекомендовано в других комментариях). Что произойдет, если у вас будет больше строк, чем это фиксированное количество? Предполагая, что следующее значение последовательности выше, чем все идентификаторы существующих строк (вы просто хотите заполнить пробелы), я бы сделал это так:
источник
В моем случае я добился этого с помощью:
Где моя таблица называется таблицей
источник
Вдохновленный другими ответами здесь, я создал функцию SQL для миграции последовательности. Функция перемещает последовательность первичных ключей в новую непрерывную последовательность, начиная с любого значения (> = 1) внутри или вне существующего диапазона последовательностей.
Я объясняю здесь, как я использовал эту функцию при миграции двух баз данных с одинаковой схемой, но разными значениями в одну базу данных.
Во-первых, функция (которая печатает сгенерированные команды SQL, чтобы было понятно, что на самом деле происходит):
Функция
migrate_pkey_sequence
принимает следующие аргументы:arg_table
: имя таблицы (например'example'
)arg_column
: имя столбца первичного ключа (например'id'
)arg_sequence
: название последовательности (например'example_id_seq'
)arg_next_value
: следующее значение столбца после миграцииОн выполняет следующие операции:
nextval('example_id_seq')
следуетmax(id)
и что последовательность начинается с 1. Это также относится к случаю, когдаarg_next_value > max(id)
.arg_next_value
. Порядок значений ключей сохраняется, но дыры в диапазоне не сохраняются.Для демонстрации мы используем последовательность и таблицу, определенные следующим образом (например, используя
psql
):Затем мы вставляем некоторые значения (начиная, например, с 3):
Наконец, мы переносим
example.id
значения, чтобы начать с 1.Результат:
источник
Даже столбец автоинкремента не является PK (в этом примере он называется seq - aka sequence), вы можете добиться этого с помощью триггера:
УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ DevOps_guide CASCADE;
источник
Если вы используете pgAdmin3, разверните «Последовательности», щелкните правой кнопкой мыши последовательность, перейдите в «Свойства» и на вкладке «Определение» измените «Текущее значение» на любое желаемое значение. В запросе нет необходимости.
источник