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
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 |