Atualização: Este bug foi corrigido no PostgreSQL v12 com commit 19781729f78 .
O resto da resposta é relevante para versões mais antigas.
Um
serial
coluna tem uma sequência que pertence à coluna e um DEFAULT
valor que obtém o valor da sequência líquida. Se você tentar alterar essa coluna para uma coluna de identidade, receberá um erro informando que já existe um valor padrão para a coluna.
Agora você deve ter descartado o valor padrão, mas não a sequência que pertence ao
serial
coluna. Então, quando você converteu a coluna em uma coluna de identidade, uma segunda sequência de propriedade da coluna foi criada. Agora, quando você tenta inserir uma linha, o PostgreSQL tenta encontrar e usar o seqüência de propriedade da coluna, mas há duas, daí a mensagem de erro.
Eu diria que isso é um bug no PostgreSQL:na minha opinião, ele deveria ter reaproveitado a sequência existente para a coluna de identidade ou dado um erro de que já existe uma sequência de propriedade da coluna e você deve eliminá-la. Vou tentar corrigir esse bug .
Enquanto isso, você deve descartar manualmente a sequência deixada para trás do
serial
column.Execute a seguinte consulta: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;
Isso deve fornecer o nome da sequência deixada para trás do
serial
coluna. Solte-o e a coluna de identidade deve se comportar conforme desejado.