Thread: Re: referential integrity (fwd)

Re: referential integrity (fwd)

From
Manuel Cabido
Date:
Sir:

  I have two tables  customer and order defined as follows:

  create table customer (
      custno   integer not null,
      name     varchar(30),
      address  varchar(30),
      primary key (custno));

  create table order (
      orderno  integer not null,
      custno   integer,
      orddate  date,
      amount   numeric(7,2),
      primary key (orderno));

  create sequence 'next_cust' start 1;
  create sequence 'next_ord'  start 1;


  My problem is how would i implement referential integrity so that
whenever i insert a new order, it should check first if the custno exist
in the customber table. Can somebody please show me an example how would i
do it in this case?

  Thank you...


                              Manny C. Cabido
                              ====================================
                              e-mail:manny@tinago.msuiit.edu.ph
                                     manny@sun.msuiit.edu.ph
                              =====================================




Re: [GENERAL] Re: referential integrity (fwd)

From
Ed Loehr
Date:
Manuel Cabido wrote:

>
>   My problem is how would i implement referential integrity so that
> whenever i insert a new order, it should check first if the custno exist
> in the customber table. Can somebody please show me an example how would i
> do it in this case?

You may do this via triggers and procedures using the semi-built-in
postgresql language called "PL/pgSQL".  Here are a couple of useful
references:

    http://www.deja.com/getdoc.xp?AN=548176178  (to activate the language in
your db)
    http://www.postgresql.org/docs/postgres/sql-createtrigger.htm
    http://www.postgresql.org/docs/postgres/sql-createfunction.htm

There are numerous other examples in the .../src/test/regress/sql/plpgsql.sql
file.  Yours will look something like this:

CREATE FUNCTION check_for_customer() RETURNS OPAQUE AS
'DECLARE
        cust RECORD;
 BEGIN
        SELECT INTO temp * FROM customer WHERE custno = NEW.custno;
        if not found then
                RAISE EXCEPTION ''TRIGGER % % % % on RELATION % : Cannot
insert an order with a non-existent customer number (%)'', TG_NAME, TG_WHEN,
TG_LEVEL, TG_OP, TG_RELNAME, NEW.custno;
        end if;
        RETURN NEW;
END;'
LANGUAGE 'plpgsql';

CREATE TRIGGER order_insert_trigger
        AFTER INSERT ON order
        FOR EACH ROW EXECUTE PROCEDURE check_for_customer ();

There is work in progress to provide more automated support for this in
version 7.x, possibly sometime this year.

Cheers,
Ed Loehr