Error de PostgreSQL: La relación ya existe


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

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

La relación 'A' ya existe.

Verifiqué hacer SELECT * FROM A, pero luego obtuve otro error:

La relación 'A' no existe.

Ya traté de encontrarlo en \dS+ enumerando todas las relaciones, y no está allí.
Para complicar esto, he probado esto creando esta tabla en otra base de datos y obtuve el mismo error. Estoy pensando que podría ser un error cuando se eliminó esta tabla. Alguna idea?

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)
);
Author: Brian Tompsett - 汤莱恩, 2012-01-09

7 answers

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

 26
Author: nsbm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-12 12:57:40

No debe haber comillas simples aquí 'A'. Las comillas simples son para literales de cadena: 'some value'.
Utilice comillas dobles para preservar la ortografía en mayúsculas de "A":

CREATE TABLE "A" ...

O no use comillas en absoluto:

CREATE TABLE A ...

Que es idéntico a

CREATE TABLE a ...

Porque todos los identificadores no entrecomillados son plegados a minúsculas automáticamente en PostgreSQL.


Puede evitar problemas con el nombre del índice completamente usando simpler sintaxis:

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 que evita conflictos de nombres automáticamente. Selecciona automáticamente el siguiente identificador gratuito. Más información sobre el tipo serial en el manual.

 10
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-11 11:54:21

No puede crear una tabla con un nombre idéntico a una tabla o vista existente en el clúster. Para modificar una tabla existente, utilice ALTER TABLE (enlace) , o para soltar todos los datos 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 tienes la secuencia definida, probablemente debería saltarse la creación. Desafortunadamente, no hay equivalente en CREATE SEQUENCE a la construcción IF NOT EXISTS disponible en CREATE TABLE. Por el aspecto de la misma, usted podría estar creando su esquema incondicionalmente, de todos modos, por lo que es razonable utilizar

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

Antes del resto de la actualización del esquema; En caso de que no sea obvio, Esto eliminará todos los datos de la tabla csd_relationship, si hay algún

 5
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-23 14:47:09

En mi caso, no fue hasta que pausé el archivo por lotes y lo desplazé un poco, ese no fue el único error que había recibido. Mi comando DROP se había convertido en DROP y por lo tanto la tabla no estaba cayendo en primer lugar (por lo tanto, la relación de hecho todavía existe). El  que he aprendido se llama una 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 ejecutará bien.

 2
Author: user5775085,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 19:03:05

En mi caso, tenía una secuencia con el mismo nombre.

 2
Author: Dave Van den Eynde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 15:06:35

En mi caso estaba 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 que 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
 0
Author: Nicolas Boisteault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 10:30:15

Otra razón por la que puede obtener errores como "relation already exists" 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 necesita cerrar primero.

 0
Author: isedwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 11:58:14