Hello Guys;

Today, I have noticed that my dumps are not working due to bad practice in 
writing SQL queries. 


In the past,  I there was a scenario where I there are two tables,  one of them 
is completely dependent on the other.  i.e.   the foreign key and the primary 
key constraint assigned to the same column.  Please have a look on this is a 
fictional example, 


CREATE TABLE a
(
  a_id serial NOT NULL,
  a_name text,
  CONSTRAINT a_pkey PRIMARY KEY (a_id)
)
WITH (
  OIDS=FALSE
);

INSERT INTO a VALUES (1, 'Big design up front');
INSERT INTO a VALUES (2, 'iterative and incremental');
INSERT INTO a VALUES (3, 'OR mappers are slow');

DROP TABLE IF EXISTS b CASCADE;
CREATE TABLE b
(
  b_id serial NOT NULL,
  b_name text,
  CONSTRAINT b_pkey PRIMARY KEY (b_id),
  CONSTRAINT b_b_id_fkey FOREIGN KEY (b_id)
      REFERENCES a (a_id) MATCH SIMPLE
      ON UPDATE NO
 ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);

INSERT INTO B VALUES (1, 'waterfall');
INSERT INTO B VALUES (2, 'XP'); 


Now I have a table which maps also  A and B in many to many relation  such as 


CREATE TABLE c
(
  c_id serial NOT NULL,
  a_id integer NOT NULL,
  b_id integer NOT NULL,
  CONSTRAINT c_pkey PRIMARY KEY (c_id),
  CONSTRAINT c_a_id_fkey FOREIGN KEY (a_id)
      REFERENCES a (a_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT c_b_id_fkey FOREIGN KEY (b_id)
      REFERENCES b (b_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);

INSERT INTO c VALUES (1,1,3);
INSERT INTO c VALUES
 (2,2,3);
INSERT INTO c VALUES (2,2,1); -- iterative and incremental waterfall model

The problem I had is that, many queries are written using the 'using clause' 
such as 


REATE VIEW c_a_b AS 
    SELECT * FROM 
    C JOIN B USING (b_id)
    JOIN A USING  (a_id);

Up till now no problems, But,  if I change the relationship between A and B by 
having another column called a_id in the B table which references the a (a_id)  
-Please see the code below- , I get problems in restore because I am joining 
using a filed which is ambiguous -Exists in two tables- . 


ALTER TABLE B ADD COlUMN a_id INTEGER;
ALTER TABLE B DROP CONSTRAINT b_b_id_fkey;
ALTER TABLE B ADD CONSTRAINT b_a_id_fkey FOREIGN KEY (a_id) REFERENCES a (a_id) 
MATCH SIMPLE   ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE;


---- This is the error 

pg_restore: [Archivierer (DB)] Fehler in Inhaltsverzeichniseintrag  VIEW c_a_b 
postgres
pg_restore: [Archivierer (DB)] could not execute query: ERROR:  common column 
name "a_id" appears more than once in left table

--------------------------------------------------------------------------------
I have a question:

1. How we can detect these errors, and how views are stored and manipulated in 
the database server . If I run  SELECT * FROM a_b_c , everything will go fine.  
I discover this only by using dump and restore.


Regards

Reply via email to