ОШИБКА: в Postgres найдено несколько принадлежащих им последовательностей - PullRequest
1 голос
/ 14 апреля 2019

Я настраиваю столбец идентификаторов для моих существующих столбцов для таблицы Patient.
Здесь я хотел бы использовать ВСЕГДА В КАЧЕСТВЕ ИДЕНТИЧНОСТИ .

Так что яНастройте столбец идентификаторов, используя следующую инструкцию (ранее это было serial):

ALTER TABLE Patient ALTER PatientId
   ADD GENERATED ALWAYS AS IDENTITY (START WITH 1);

Для существующей таблицы пациентов у меня всего 5 записей.(patientId 1 до 5)
Когда я вставляю новую запись после настройки идентификатора, она выдаст ошибку вроде:

more than one owned sequence found

Даже после сброса столбца идентификатора, я все равно получаю то же самоеошибка.

ALTER TABLE Patient ALTER COLUMN PatientId RESTART WITH 6;

Дайте мне знать, если у вас есть какие-либо решения.

1 Ответ

1 голос
/ 14 апреля 2019
Столбец

A serial содержит последовательность, которой владеет столбец, и значение DEFAULT, которое получает значение чистой последовательности.

Если вы попытаетесь изменить этот столбец в столбец идентификаторов, вы 'Вы получите сообщение об ошибке, что для столбца уже есть значение по умолчанию.

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

Теперь, когда вы пытаетесь вставить строку, PostgreSQL пытается найти и использовать последовательность принадлежит столбцу, но их два, поэтому появляется сообщение об ошибке.

Я бы сказал, что это ошибка в PostgreSQL: по моему мнению, он должен был либо изменить существующую последовательность для столбца идентификаторов, либоиз-за ошибки, что столбцу уже принадлежит последовательность, и вы должны ее удалить. Я постараюсь исправить эту ошибку .

Тем временем вы должны вручную удалить последовательность, оставленную позади, из столбца serial.Запустите следующий запрос:

SELECT d.objid::regclass
FROM pg_depend AS d
   JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
                             d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
  AND d.refclassid = 'pg_class'::regclass
  AND d.deptype <> 'i'
  AND a.attname = 'patientid'
  AND d.refobjid = 'patient'::regclass;

Это должно дать вам имя последовательности, оставленной после столбца serial.Отбросьте его, и столбец идентификаторов должен вести себя как нужно.

...