sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR:se encontró más de una secuencia propia en Postgres

Actualización: Este error se solucionó en PostgreSQL v12 con commit 19781729f78 .
El resto de la respuesta es relevante para versiones anteriores.

Una serial columna tiene una secuencia que es propiedad de la columna y un DEFAULT valor que obtiene el valor de la secuencia neta.

Si intenta cambiar esa columna a una columna de identidad, obtendrá un error que indica que ya existe un valor predeterminado para la columna.

Ahora debe haber descartado el valor predeterminado, pero no la secuencia que pertenece al serial columna. Luego, cuando convirtió la columna en una columna de identidad, se creó una segunda secuencia propiedad de la columna.

Ahora, cuando intenta insertar una fila, PostgreSQL intenta encontrar y usar the secuencia propiedad de la columna, pero hay dos, de ahí el mensaje de error.

Yo diría que se trata de un error en PostgreSQL:en mi opinión, debería haber reutilizado la secuencia existente para la columna de identidad o haberle dado un error de que ya existe una secuencia propiedad de la columna, y debería descartarla. Intentaré solucionar este error .

Mientras tanto, debe eliminar manualmente la secuencia que quedó atrás del serial columna. Ejecute la siguiente 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;

Eso debería darte el nombre de la secuencia que quedó del serial columna. Suéltelo y la columna de identidad debería comportarse como se desea.