Thread: Temporal foreign keys

Temporal foreign keys

From
Matthias
Date:
Hey,

how can I implement temporal foreign keys with postgresql? Is writing
triggers the only way to enforce temporal referential integrity
currently?

-Matthias

Re: Temporal foreign keys

From
Jeff Davis
Date:
On Fri, 2012-02-03 at 07:58 +0100, Matthias wrote:
> Hey,
>
> how can I implement temporal foreign keys with postgresql? Is writing
> triggers the only way to enforce temporal referential integrity
> currently?

Yes, currently that's the only way. Look at CREATE CONSTRAINT TRIGGER.

Regards,
    Jeff Davis


Re: Temporal foreign keys

From
Andreas Kretschmer
Date:
Jeff Davis <pgsql@j-davis.com> wrote:

> On Fri, 2012-02-03 at 07:58 +0100, Matthias wrote:
> > Hey,
> >
> > how can I implement temporal foreign keys with postgresql? Is writing
> > triggers the only way to enforce temporal referential integrity
> > currently?
>
> Yes, currently that's the only way. Look at CREATE CONSTRAINT TRIGGER.

It works in 9.2devel ;-)

test=# create table x (d daterange primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey"
for table "x"
CREATE TABLE
test=*# create table y (d daterange references x);
CREATE TABLE
test=*# insert into x values ('[2012-01-01,2012-01-10)');
INSERT 0 1
test=*# insert into y values ('[2012-01-01,2012-01-10)');
INSERT 0 1
test=*# insert into y values ('[2012-01-01,2012-01-20)');
ERROR:  insert or update on table "y" violates foreign key constraint "y_d_fkey"
DETAIL:  Key (d)=([2012-01-01,2012-01-20)) is not present in table "x".



Jeff: thx for YOUR work!


Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect.                              (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly."   (unknown)
Kaufbach, Saxony, Germany, Europe.              N 51.05082°, E 13.56889°

Re: Temporal foreign keys

From
Jeff Davis
Date:
On Fri, 2012-03-16 at 15:13 +0100, Andreas Kretschmer wrote:
> > On Fri, 2012-02-03 at 07:58 +0100, Matthias wrote:
> > > how can I implement temporal foreign keys with postgresql? Is writing
> > > triggers the only way to enforce temporal referential integrity
> > > currently?
> >
> It works in 9.2devel ;-)
>
> test=# create table x (d daterange primary key);
> NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey"
> for table "x"
> CREATE TABLE
> test=*# create table y (d daterange references x);
> CREATE TABLE
> test=*# insert into x values ('[2012-01-01,2012-01-10)');
> INSERT 0 1
> test=*# insert into y values ('[2012-01-01,2012-01-10)');
> INSERT 0 1
> test=*# insert into y values ('[2012-01-01,2012-01-20)');
> ERROR:  insert or update on table "y" violates foreign key constraint "y_d_fkey"
> DETAIL:  Key (d)=([2012-01-01,2012-01-20)) is not present in table "x".

If I understand what he was asking for, it was a kind of "range foreign
key" which means that the following query should succeed:

  insert into y values ('[2012-01-02,2012-01-04)');

because that range is contained in a value in the table x.

So it's slightly different semantics than a normal foreign key.

But yes, normal foreign keys (based on equality) work fine over range
types.

Regards,
    Jeff Davis


Re: Temporal foreign keys

From
Simon Riggs
Date:
On Fri, Feb 3, 2012 at 6:58 AM, Matthias <nitrogenycs@googlemail.com> wrote:

> how can I implement temporal foreign keys with postgresql? Is writing
> triggers the only way to enforce temporal referential integrity
> currently?

I think you need to explain what you want slightly better.

My guess would be you want this

  create table x (d daterange primary key);
  create table y (e date references x (d));

which is a lookup to show that the date is within a valid date range.

But you may also want this...

  create table x (id integer, d daterange, primary key(id, d));
  create table y (id integer, xid integer, e date, foreign key (xid,
e) references x (id, d));

which is to locate the valid row within a temporal lookup table.

Neither is possible, as yet.

Or you might want something entirely different?

--
 Simon Riggs                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services