Thread: [BUGS] BUG #14791: Error 42P07 but the relation DOESN'T Exists! Error 42P01
[BUGS] BUG #14791: Error 42P07 but the relation DOESN'T Exists! Error 42P01
From
jfblazquez.ayesa@gmail.com
Date:
The following bug has been logged on the website: Bug reference: 14791 Logged by: Juan Francisco Blázquez Martínez Email address: jfblazquez.ayesa@gmail.com PostgreSQL version: 9.4.1 Operating system: Windows 7 SP1 x32 Description: I was creating tables using scripts via pgAdmin when it suddenly crashed while creating a table: "scada_equipment_instance" After restarting pgAdmin and psql service, I can't create or use "scada_equipment_instance" table anymore. It says: ERROR: la relación «scada_equipment_instance» ya existe SQL state: 42P07 or ERROR: no existe la relación «scada_equipment_instance» SQL state: 42P01 I've tried in a different database, but I have still the same problem (see code below), even using command line psql (instead pgadmin). What should I do? Thank you! ======================================== SCRIPT: ======================================== CREATE TABLE scada_facility_type ( x_scada_facility_type serial NOT NULL, -- identificador interno d_name character varying(50), -- nombre del tipo de instalaciónd_code character(1), -- código del tipo de instalación para generar los TAGS en SCADA CONSTRAINT pk_scada_facility_type PRIMARY KEY (x_scada_facility_type) ) WITH ( OIDS=FALSE ); ALTER TABLE scada_facility_type OWNER TO postgres; COMMENT ON TABLE scada_facility_type IS 'Contiene los códigos de instalación para generar los TAGs en SCADA'; COMMENT ON COLUMN scada_facility_type.x_scada_facility_type IS 'identificador interno'; COMMENT ON COLUMN scada_facility_type.d_name IS 'nombre del tipo de instalación'; COMMENT ON COLUMN scada_facility_type.d_code IS 'código del tipo de instalación para generar los TAGS en SCADA'; CREATE TABLE scada_facility_instance ( x_scada_facility_instance serial NOT NULL, -- identificador interno d_name character varying(50), -- nombre de la instalaciónd_number character(3), -- código secuencial de instalación para generar los TAGS en SCADA facility_type_x_facility_type integer NOT NULL, CONSTRAINT pk_scada_facility_instance PRIMARY KEY (x_scada_facility_instance), CONSTRAINT fk_scada_facility_instance_scada_facility_type FOREIGN KEY (facility_type_x_facility_type) REFERENCES scada_facility_type (x_scada_facility_type) MATCH SIMPLE ON UPDATE CASCADEON DELETE CASCADE ) WITH ( OIDS=FALSE ); ALTER TABLE scada_facility_instance OWNER TO postgres; COMMENT ON TABLE scada_facility_instance IS 'Contiene la lista de instalaciones para generar los TAGs en SCADA'; COMMENT ON COLUMN scada_facility_instance.x_scada_facility_instance IS 'identificador interno'; COMMENT ON COLUMN scada_facility_instance.d_name IS 'nombre de la instalación'; COMMENT ON COLUMN scada_facility_instance.d_number IS 'código secuencial de instalación para generar los TAGS en SCADA'; CREATE TABLE scada_facility_area_instance ( x_scada_facility_area_instance serial NOT NULL, -- identificador interno facility_instance_x_facility_instance integerNOT NULL, d_name character varying(50), -- nombre del área d_code character(3) NOT NULL, -- código del área para generarlos TAGS en SCADA d_number character(3) NOT NULL, -- código secuencial del área de instalación para generar los TAGS en SCADA CONSTRAINT pk_scada_facility_area_instance PRIMARY KEY (x_scada_facility_area_instance), CONSTRAINT fk_scada_facility_area_instance_facility_instance FOREIGN KEY (facility_instance_x_facility_instance) REFERENCES scada_facility_instance (x_scada_facility_instance) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITH ( OIDS=FALSE ); ALTER TABLE scada_facility_area_instance OWNER TO postgres; COMMENT ON TABLE scada_facility_area_instance IS 'Contiene las áreas asociadas a cada instalación para generar las señales de SCADA'; COMMENT ON COLUMN scada_facility_area_instance.x_scada_facility_area_instance IS 'identificador interno'; COMMENT ON COLUMN scada_facility_area_instance.d_name IS 'nombre del área'; COMMENT ON COLUMN scada_facility_area_instance.d_code IS 'código del área para generar los TAGS en SCADA'; COMMENT ON COLUMN scada_facility_area_instance.d_number IS 'código secuencial del área de instalación para generar los TAGS en SCADA'; CREATE TABLE scada_equipment_type ( x_scada_equipment_type serial NOT NULL, -- identificador interno d_name character varying(50), -- nombre del equipo d_codecharacter(2), -- código del equipo para generar los TAGS en SCADA CONSTRAINT pk_scada_equipment_type PRIMARY KEY (x_scada_equipment_type) ) WITH ( OIDS=FALSE ); ALTER TABLE scada_equipment_type OWNER TO postgres; COMMENT ON TABLE scada_equipment_type IS 'Contiene los códigos de equipos para generar los TAGs en SCADA'; COMMENT ON COLUMN scada_equipment_type.x_scada_equipment_type IS 'identificador interno'; COMMENT ON COLUMN scada_equipment_type.d_name IS 'nombre del equipo'; COMMENT ON COLUMN scada_equipment_type.d_code IS 'código del equipo para generar los TAGS en SCADA'; CREATE TABLE scada_equipment_instance ( x_scada_equipment_instance serial NOT NULL, -- identificador interno facility_area_instance_x_facility_area_instance integerNOT NULL, equipment_type_x_equipment_type integer NOT NULL, -- Referencia al tipo de equipo d_number character(3) NOT NULL, -- código secuencial del equipo de instalación para generar los TAGS en SCADA d_name character varying(50), -- nombre del equipo CONSTRAINT pk_scada_equipment_instancePRIMARY KEY (x_scada_equipment_instance), CONSTRAINT fk_scada_equipment_instance_facility_area_instance FOREIGN KEY (facility_area_instance_x_facility_area_instance) REFERENCES scada_facility_area_instance (x_scada_facility_area_instance) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT scada_equipment_instanceUNIQUE (facility_area_instance_x_facility_area_instance, equipment_type_x_equipment_type, d_number) ) WITH ( OIDS=FALSE ); ALTER TABLE scada_equipment_instance OWNER TO postgres; COMMENT ON TABLE scada_equipment_instance IS 'Contiene los equipos asociados a cada área de instalación para generar las señales de SCADA'; COMMENT ON COLUMN scada_equipment_instance.x_scada_equipment_instance IS 'identificador interno'; COMMENT ON COLUMN scada_equipment_instance.d_name IS 'nombre del equipo'; COMMENT ON COLUMN scada_equipment_instance.equipment_type_x_equipment_type IS 'Referencia al tipo de equipo'; COMMENT ON COLUMN scada_equipment_instance.d_number IS 'código secuencial del área de instalación para generar los TAGS en SCADA'; ======================================== OUTPUT: ======================================== c:\PostgreSQL\9.4\bin>psql.exe -U postgres psql (9.4.1) ADVERTENCIA: El código de página de la consola (850) difiere del código de página de Windows (1252). Digite «help» para obtener ayuda. postgres=# CREATE DATABASE "TEST" postgres-# WITH OWNER = postgres postgres-# ENCODING = 'UTF8' postgres-# TABLESPACE = pg_default postgres-# LC_COLLATE = 'Spanish_Spain.1252' postgres-# LC_CTYPE = 'Spanish_Spain.1252' postgres-# CONNECTION LIMIT = -1; CREATE DATABASE postgres=# postgres=# \connect TEST ADVERTENCIA: El código de página de la consola (850) difiere del código de página de Windows (1252). Ahora está conectado a la base de datos «TEST» con el usuario «postgres». TEST=# \d No se encontraron relaciones. TEST=# TEST=# CREATE TABLE scada_facility_type TEST-# ( TEST(# x_scada_facility_type serial NOT NULL, -- identificador interno TEST(# d_name character varying(50), -- nombre del tipo de instalación TEST(# d_code character(1), -- código del tipo de instalación para generar los TAGS en SCADA TEST(# CONSTRAINT pk_scada_facility_type PRIMARY KEY (x_scada_facility_type) TEST(# ) TEST-# WITH ( TEST(# OIDS=FALSE TEST(# ); CREATE TABLE TEST=# ALTER TABLE scada_facility_type TEST-# OWNER TO postgres; ALTER TABLE TEST=# COMMENT ON TABLE scada_facility_type TEST-# IS 'Contiene los códigos de instalación para generar los TAGs en SCADA'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_type.x_scada_facility_type IS 'identificador interno'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_type.d_name IS 'nombre del tipo de instalación'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_type.d_code IS 'código del tipo de instalación para generar los TAGS en SCADA'; COMMENT TEST=# TEST=# TEST=# CREATE TABLE scada_facility_instance TEST-# ( TEST(# x_scada_facility_instance serial NOT NULL, -- identificador interno TEST(# d_name character varying(50), -- nombre de la instalación TEST(# d_number character(3), -- código secuencial de instalación para generar los TAGS en SCADA TEST(# facility_type_x_facility_type integer NOT NULL, TEST(# CONSTRAINT pk_scada_facility_instance PRIMARY KEY (x_scada_facility_instance), TEST(# CONSTRAINT fk_scada_facility_instance_scada_facility_type FOREIGN KEY (facility_type_x_facility_type) TEST(# REFERENCES scada_facility_type (x_scada_facility_type) MATCH SIMPLE TEST(# ON UPDATE CASCADE ON DELETE CASCADE TEST(# ) TEST-# WITH ( TEST(# OIDS=FALSE TEST(# ); CREATE TABLE TEST=# ALTER TABLE scada_facility_instance TEST-# OWNER TO postgres; ALTER TABLE TEST=# COMMENT ON TABLE scada_facility_instance TEST-# IS 'Contiene la lista de instalaciones para generar los TAGs en SCADA'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_instance.x_scada_facility_instance IS 'identificador interno'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_instance.d_name IS 'nombre de la instalación'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_instance.d_number IS 'código secuencial de instalación para generar los TAGS en SCADA'; COMMENT TEST=# TEST=# TEST=# CREATE TABLE scada_facility_area_instance TEST-# ( TEST(# x_scada_facility_area_instance serial NOT NULL, -- identificador interno TEST(# facility_instance_x_facility_instance integer NOT NULL, TEST(# d_name character varying(50), -- nombre del área TEST(# d_code character(3) NOT NULL, -- código del área para generar los TAGS en SCADA TEST(# d_number character(3) NOT NULL, -- código secuencial del área de instalación para generar los TAGS en SCADA TEST(# CONSTRAINT pk_scada_facility_area_instance PRIMARY KEY (x_scada_facility_area_instance), TEST(# CONSTRAINT fk_scada_facility_area_instance_facility_instance FOREIGN KEY (facility_instance_x_facility_instance) TEST(# REFERENCES scada_facility_instance (x_scada_facility_instance) MATCH SIMPLE TEST(# ON UPDATE NO ACTION ON DELETE NO ACTION TEST(# ) TEST-# WITH ( TEST(# OIDS=FALSE TEST(# ); CREATE TABLE TEST=# ALTER TABLE scada_facility_area_instance TEST-# OWNER TO postgres; ALTER TABLE TEST=# COMMENT ON TABLE scada_facility_area_instance TEST-# IS 'Contiene las áreas asociadas a cada instalación para generar las señales de SCADA'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_area_instance.x_scada_facility_area_instance IS 'identificador interno'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_area_instance.d_name IS 'nombre del área'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_area_instance.d_code IS 'código del área para generar los TAGS en SCADA'; COMMENT TEST=# COMMENT ON COLUMN scada_facility_area_instance.d_number IS 'código secuencial del área de instalación para generar los TAGS en SCADA'; COMMENT TEST=# TEST=# TEST=# CREATE TABLE scada_equipment_type TEST-# ( TEST(# x_scada_equipment_type serial NOT NULL, -- identificador interno TEST(# d_name character varying(50), -- nombre del equipo TEST(# d_code character(2), -- código del equipo para generar los TAGS en SCADA TEST(# CONSTRAINT pk_scada_equipment_type PRIMARY KEY (x_scada_equipment_type) TEST(# ) TEST-# WITH ( TEST(# OIDS=FALSE TEST(# ); CREATE TABLE TEST=# ALTER TABLE scada_equipment_type TEST-# OWNER TO postgres; ALTER TABLE TEST=# COMMENT ON TABLE scada_equipment_type TEST-# IS 'Contiene los códigos de equipos para generar los TAGs en SCADA'; COMMENT TEST=# COMMENT ON COLUMN scada_equipment_type.x_scada_equipment_type IS 'identificador interno'; COMMENT TEST=# COMMENT ON COLUMN scada_equipment_type.d_name IS 'nombre del equipo'; COMMENT TEST=# COMMENT ON COLUMN scada_equipment_type.d_code IS 'código del equipo para generar los TAGS en SCADA'; COMMENT TEST=# TEST=# \d Listado de relacionesEsquema | Nombre | Tipo | Due├▒o ---------+-----------------------------------------------------------------+-----------+----------public | scada_equipment_type | tabla | postgrespublic | scada_equipment_type_x_scada_equipment_type_seq | secuencia | postgrespublic | scada_facility_area_instance | tabla | postgrespublic | scada_facility_area_instance_x_scada_facility_area_instance_seq | secuencia | postgrespublic | scada_facility_instance | tabla | postgrespublic | scada_facility_instance_x_scada_facility_instance_seq | secuencia | postgrespublic | scada_facility_type | tabla | postgrespublic | scada_facility_type_x_scada_facility_type_seq | secuencia | postgres (8 filas) TEST=# TEST=# CREATE TABLE scada_equipment_instance TEST-# ( TEST(# x_scada_equipment_instance serial NOT NULL, -- identificador interno TEST(# facility_area_instance_x_facility_area_instance integer NOT NULL, TEST(# equipment_type_x_equipment_type integer NOT NULL, -- Referencia al tipo de equipo TEST(# d_number character(3) NOT NULL, -- código secuencial del equipo de instalación para generar los TAGS en SCADA TEST(# d_name character varying(50), -- nombre del equipo TEST(# CONSTRAINT pk_scada_equipment_instance PRIMARY KEY (x_scada_equipment_instance), TEST(# CONSTRAINT fk_scada_equipment_instance_facility_area_instance FOREIGN KEY (facility_area_instance_x_facility_area_instance) TEST(# REFERENCES scada_facility_area_instance (x_scada_facility_area_instance) MATCH SIMPLE TEST(# ON UPDATE NO ACTION ON DELETE NO ACTION, TEST(# CONSTRAINT scada_equipment_instance UNIQUE (facility_area_instance_x_facility_area_instance, equipment_type_x_equipment_type, d_number) TEST(# ) TEST-# WITH ( TEST(# OIDS=FALSE TEST(# ); ERROR: la relación «scada_equipment_instance» ya existe TEST=# ALTER TABLE scada_equipment_instance TEST-# OWNER TO postgres; ERROR: no existe la relación «scada_equipment_instance» ======================================== -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs
jfblazquez.ayesa@gmail.com writes: > TEST=# CREATE TABLE scada_equipment_instance > ... > TEST(# CONSTRAINT scada_equipment_instance UNIQUE > ... > ERROR: la relación «scada_equipment_instance» ya existe The problem here is that that unique constraint has to have an underlying index, and the index will be named the same as the constraint, causing it to collide with the table name. So this error is really coming from the implied CREATE INDEX command: it sees a conflicting relation name already in place. After the whole command rolls back, of course you have no table either, so this is unsurprising: > TEST=# ALTER TABLE scada_equipment_instance > TEST-# OWNER TO postgres; > ERROR: no existe la relación «scada_equipment_instance» Short answer is that unique/pkey constraints can't be named the same as any table in the same schema. Personally I'd leave off the "CONSTRAINT name" part altogether and let the system pick a nonconflicting index name. (Not sure that our documentation is sufficiently clear on this. Since it's not really what you'd expect from reading the SQL standard, maybe we need to mention it in more places than we do now.) regards, tom lane -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs
Re: [BUGS] BUG #14791: Error 42P07 but the relation DOESN'T Exists!Error 42P01
From
Alvaro Herrera
Date:
jfblazquez.ayesa@gmail.com wrote: > I was creating tables using scripts via pgAdmin when it suddenly crashed > while creating a table: "scada_equipment_instance" > > After restarting pgAdmin and psql service, I can't create or use > "scada_equipment_instance" table anymore. It says: > > ERROR: la relación «scada_equipment_instance» ya existe > SQL state: 42P07 [Translation: relation "scada_equipment_instance" already exists] Juan Francisco followed up to the moderator address to indicate that he found the problem -- there's a constraint that uses the same name as the table, causing the error. Case closed. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs