#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 Ах да, пропущенная цитата. Обратите внимание, что поскольку вы используете таблицы / столбцы с заглавными буквами, вам нужно будет везде добавлять двойные кавычки -> гораздо проще всегда использовать имена в нижнем регистре