Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-de-allgemein by date

Next:From: Olaf RadickeDate: 2008-03-11 10:25:26
Subject: Re: Check Constraint mit Subselect
Previous:From: Rainer LayDate: 2008-03-11 07:54:49
Subject: Re: Check Constraint mit Subselect

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group