PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO:mais de uma sequência de propriedade encontrada no Postgres


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.