Re: Check Constraint mit Subselect

From: Thomas Guettler <hv(at)tbz-pariv(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Check Constraint mit Subselect
Date: 2008-03-11 09:48:27
Message-ID: 47D6556B.5090801@tbz-pariv.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hallo,

Ziel: Constraint, dass bei einer 1:N Beziehung N größer Null.

danke für eure Antworten,

Leider funktioniert das nicht wie ich mir dachte:

1. Check Constraints lassen sich nicht auf deferrable setzen.
http://www.postgresql.org/docs/8.3/interactive/sql-createtable.html
"""
DEFERRABLE ...Only foreign key constraints currently accept this clause.

2. Check Constraints werden nur bei INSERT und UPDATE geprüft.
Es muss aber auch geprüft werden, ob durch DELETE in der Detail
Tabelle das N der 1:N Beziehung Null wird.

Wenn obige Einschränkungen nicht wären, würde es mit diesem SQL-Code
gehen:
----------
begin;
CREATE TABLE "master" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(32) NOT NULL
);

CREATE TABLE "detail" (
"id" serial NOT NULL PRIMARY KEY,
"master_id" integer NOT NULL
);

ALTER TABLE "detail" ADD CONSTRAINT master_id_constraint
FOREIGN KEY ("master_id") REFERENCES "master" ("id") DEFERRABLE
INITIALLY DEFERRED;

create or replace function count_detail(in master_id int)
returns bigint as $$
select count(master_id) from detail where detail.master_id=$1
$$ language sql;

alter table master add constraint constraint_master
check(count_detail(id)>0);
alter table detail add constraint constraint_detail
check(count_detail(master_id)>0);
insert into master values (DEFAULT, 'abc');
insert into detail values (DEFAULT, 1);

commit;

begin;
insert into master values (DEFAULT, 'abc2');
commit;
---------
Da Check Constraints nicht deferrable sind, kommt diese Meldung:
FEHLER: neue Zeile für Relation »master« verletzt Check-Constraint
»constraint_master«

Aber jetzt habe ich eine Lösung gefunden: CONSTRAINT TRIGGER
http://www.postgresql.org/docs/8.3/interactive/sql-createconstraint.html

--
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Olaf Radicke 2008-03-11 10:25:26 Re: Check Constraint mit Subselect
Previous Message Rainer Lay 2008-03-11 07:54:49 Re: Check Constraint mit Subselect