Re: keeping 3 tables in sync w/ each other

From: Ow Mun Heng <Ow(dot)Mun(dot)Heng(at)wdc(dot)com>
To: Filip Rembiałkowski <plk(dot)zuber(at)gmail(dot)com>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: keeping 3 tables in sync w/ each other
Date: 2007-09-19 09:45:04
Message-ID: 1190195104.15764.22.camel@neuromancer.home.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, 2007-09-18 at 09:56 +0100, Filip Rembiałkowski wrote:
> 2007/9/18, Ow Mun Heng <Ow(dot)Mun(dot)Heng(at)wdc(dot)com>:
> > Hi,
> >
> > I have 3 tables
> >
> > foo
> > foo_loading_source1
> > foo_loading_source2
> >
> > which is something like
> >
> > create table foo (a int, b int, c int)
> > create table foo_loading_source1 (a int, b int, c int)
> > create table foo_loading_source2 (a int, b int, c int)
> >
> > Is there a way which can be made easier to keep these 3 tables DDL in
> > sync?
> >
> > the loading_sourceX tables are just a temporary-in-transit table for
> > data \copy'ied into the DB before being inserted into the main foo
> > table.
> >
> > Currently, each time I add a new column to foo, I have to "remember" to
> > add the same to the other 2 table.
> >
> > Can I use inheritance? References?
>
> Inheritance might work in this case. But it will be a bit weird,
> because you will see non-constraint data in parent unless you will
> SELECT ... FROM ONLY parent
>
>
> Try this example:
>
> create table parent ( id serial, data1 text );
> create table child () inherits( parent );
> \d child
> alter table only parent add check ( data1 like '%fits parent' );
> insert into parent(data1) select 'this data fits parent';
> insert into child(data1) select 'this data was inserted to child';
> select * from parent;
> select * from only parent;
> select * from child;
> alter table parent add column data2 text default 'new column default';
> \d child

Nope. Doesn't work as it should be.

Note : I've removed the check as well as it's not needed for my purpose.

create table parent ( id int primary key, data1 text );
create table child () inherits( parent );
insert into parent(id,data1) values (1,'parent1');
insert into parent(id,data1) values (2,'parent2');
insert into parent(id,data1) values (3,'parent3');
insert into parent(id,data1) values (4,'parent4');

insert into child(id,data1) values (6,'child1-bastard');
insert into child(id,data1) values (7,'child2-bastard');
insert into child(id,data1) values (8,'child3-bastard');
insert into child(id,data1) values (9,'child4-bastard');

=> select * from parent;
id | data1
----+----------------
1 | parent1
2 | parent2
3 | parent3
4 | parent4
6 | child1-bastard
7 | child2-bastard
8 | child3-bastard
9 | child4-bastard
1 | parent1-new

simulate a delete
=> delete from parent where id in (select id from child);
DELETE 6

=> select * from parent;
id | data1
----+---------
2 | parent2
3 | parent3
4 | parent4

=> select * from child;
id | data1
----+-------
(0 rows)

Doesn't do what I want which is to use the child table as a temp holding
ground prior to data insertion into parent table.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Ow Mun Heng 2007-09-19 09:47:12 Re: keeping 3 tables in sync w/ each other
Previous Message Stefan Schwarzer 2007-09-19 09:13:02 Calculate Weighted Aggregation between Two Tables