Импортированные данные, повторяющееся значение ключа нарушает уникальное ограничение

#postgresql #asp.net-core #npgsql

#postgresql #asp.net-core #npgsql

Вопрос:

Я переношу данные из MSSQL. Я создал базу данных в PostgreSQL с помощью миграции, сгенерированной npgsql. Я переместил данные, и теперь, когда код пытается вставить значение, я получаю «дублирующее значение ключа нарушает уникальное ограничение»

npgsql пытается вставить столбец с идентификатором 1 .. однако таблица уже имеет идентификатор более тысячи.

Npgsql.EntityFrameworkCore.PostgreSQL — 2.2.3 (последняя версия)

В моем построителе контекста у меня есть

  modelBuilder.ForNpgsqlUseIdentityColumns();
  

В каком направлении мне следует копать, чтобы решить такую проблему?

Код выполняется нормально, если база данных пуста и не содержит никаких импортированных данных

Спасибо

Ответ №1:

Значения, вставленные во время миграции, содержали значение первичного ключа, поэтому последовательность за столбцом не увеличивалась и сохраняется равной 1. Обычная вставка — без указания значения PK — вызывает последовательность, полученную 1 , которая уже существует в таблице.

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

 SELECT setval(
        pg_get_serial_sequence('myschema.mytable','mycolumn'), 
        max(mycolumn)) 
FROM myschema.mytable;
  

Если вы уже знаете имя последовательности, вы можете сократить его до

 SELECT setval('my_sequence_name', max(mycolumn)) 
FROM myschema.mytable;
  

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

1. Когда я запускаю первую команду » ВЫБЕРИТЕ setval( pg_get_serial_sequence(‘public. LogEntries’,’Id’), max (Id)) ИЗ общедоступных. Логи; «Я получаю, что связь не существует

2. то же самое для второй команды — ВЫБЕРИТЕ setval(‘LogEntries_Id_seq’, max (Id)) ИЗ общедоступного. Логи;

3. Я нашел ddl для последовательности — СОЗДАЙТЕ общедоступную последовательность.»LogEntries_Id_seq» .. и я мог видеть его значения через SELECT last_value, log_cnt, is_called FROM public.»LogEntries_Id_seq»;

4. ИЗМЕНИТЬ общедоступную последовательность.»LogEntries_Id_seq» перезапустить с 13238; сработало, но у меня есть 107 таблиц

5. @SimeonGrigorovich Ах да, пропущенная цитата. Обратите внимание, что поскольку вы используете таблицы / столбцы с заглавными буквами, вам нужно будет везде добавлять двойные кавычки -> гораздо проще всегда использовать имена в нижнем регистре