sqlstate relación psqlexception not existe exist error does 42p01 postgresql identifier create-table

postgresql - relación - sql error 42p01]: error



Error de PostgreSQL: la relación ya existe (7)

En mi caso estuve migrando de 9.5 a 9.6. Así que para restaurar una base de datos, estaba haciendo:

sudo -u postgres psql -d databse -f dump.sql

Por supuesto, se estaba ejecutando en la antigua base de datos postgreSQL donde hay datos! Si su nueva instancia está en el puerto 5433, la forma correcta es:

sudo -u postgres psql -d databse -f dump.sql -p 5433

Estoy tratando de crear una tabla que se eliminó anteriormente.

Pero cuando hago el CREATE TABLE A .. Estoy obteniendo el siguiente error:

La relación ''A'' ya existe.

Verifiqué haciendo SELECT * FROM A , pero luego recibí otro error:

La relación ''A'' no existe.

Ya traté de encontrarlo en /dS+ listando todas las relaciones, y no está ahí.
Para complicar esto, lo he probado creando esta tabla en otra base de datos y obtuve el mismo error. Estoy pensando que podría ser un error cuando esta tabla fue eliminada. ¿Algunas ideas?

Aquí está el código: estoy usando un código generado de Power SQL. Tengo el mismo error sin usar la secuencia. Simplemente funciona cuando cambio el nombre y en este caso no puedo hacer eso.

CREATE SEQUENCE csd_relationship_csd_relationship_id_seq; CREATE TABLE csd_relationship ( csd_relationship_id INTEGER NOT NULL DEFAULT nextval(''csd_relationship_csd_relationship_id_seq''::regclass), type_id INTEGER NOT NULL, object_id INTEGER NOT NULL, CONSTRAINT csd_relationship PRIMARY KEY (csd_relationship_id) );


En mi caso, no fue hasta que PAUSE el archivo por lotes y subí un poco, ese no fue el único error que había recibido. Mi comando DROP había convertido en DROP y, por lo tanto, la tabla no estaba cayendo en primer lugar (por lo tanto, la relación todavía existía). El  He aprendido se llama marca de orden de bytes (BOM). Al abrir esto en Notepad ++, vuelva a guardar el archivo SQL con la codificación establecida en UTM-8 sin BOM y se ejecuta correctamente.


En mi caso, tuve una secuencia con el mismo nombre.


Finalmente descubro el error. El problema es que el nombre de la restricción de clave principal es igual al nombre de la tabla. No sé cómo postgres representa restricciones, pero creo que el error "La relación ya existe" se activó durante la creación de la restricción de clave principal porque la tabla ya estaba declarada. Pero debido a este error, la tabla no se creó al final.


No debería haber comillas simples aquí ''A'' . Las comillas simples son para literales de cadena: ''some value'' .
O use comillas dobles para preservar la ortografía mayúscula de "A":

CREATE TABLE "A" ...

O no use citas en absoluto:

CREATE TABLE A ...

que es idéntico a

CREATE TABLE a ...

porque todos los identificadores sin comillas se doblan a minúsculas automáticamente en PostgreSQL .

Podría evitar por completo problemas con el nombre del índice usando una sintaxis más simple:

CREATE TABLE csd_relationship ( csd_relationship_id serial PRIMARY KEY, type_id integer NOT NULL, object_id integer NOT NULL );

Hace lo mismo que su consulta original, solo evita conflictos de nombres automáticamente. Selecciona el siguiente identificador libre automáticamente. Más sobre el tipo de serie en el manual .


No puede crear una tabla con un nombre que sea idéntico a una tabla o vista existente en el clúster. Para modificar una tabla existente, use ALTER TABLE (enlace) , o para eliminar todos los datos que están actualmente en la tabla y crear una tabla vacía con el esquema deseado, emita DROP TABLE antes de CREATE TABLE .

Podría ser que la secuencia que estás creando sea la culpable. En PostgreSQL, las secuencias se implementan como una tabla con un conjunto particular de columnas. Si ya tiene la secuencia definida, probablemente debería omitirla. Desafortunadamente, no hay un equivalente en CREATE SEQUENCE al constructo IF NOT EXISTS disponible en CREATE TABLE . Por lo que parece, puede estar creando su esquema incondicionalmente, de todos modos, por lo que es razonable de usar

DROP TABLE IF EXISTS csd_relationship; DROP SEQUENCE IF EXISTS csd_relationship_csd_relationship_id_seq;

antes del resto de su actualización de esquema; En caso de que no sea obvio, esto eliminará todos los datos en la tabla csd_relationship , si hay alguna


Otra razón por la que podría obtener errores como "la relación ya existe" es si el comando DROP no se ejecutó correctamente.

Una razón por la que esto puede suceder es si hay otras sesiones conectadas a la base de datos que debe cerrar primero.