Re: [Pgsql-ayuda] Problemas para agregar una CONSTRAINT CHECK

From: "Guillermo Schulman" <guillepsql(at)hotmail(dot)com>
To: alvherre(at)dcc(dot)uchile(dot)cl
Cc: Pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: [Pgsql-ayuda] Problemas para agregar una CONSTRAINT CHECK
Date: 2003-09-25 15:59:25
Message-ID: Law12-F898YV2btIXwG000344bf@hotmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Sí, en efecto ese era el problema. Gracias.
De todas formas me encuentro ante uno nuevo: quiero que mi constraint
controle que no más de un registro de la tabla catalog_item tenga el campo
express en true para un mismo catalogid (es decir, la tabla contiene los
items para unos catalogos de forma que cada catalogid tiene tantos registros
como items posea el catalogo y el campo express es boolean y marca
determinada característica especial de un item. Un solo item de cada
catalogo puede ser express).

Para esto creé la siguiente simple función:

CREATE OR REPLACE FUNCTION fu_check_express (integer)
RETURNS INTEGER AS '
DECLARE
nCatalogId ALIAS FOR \$1;
nCant INTEGER;
BEGIN
SELECT INTO nCant count(*)
FROM catalog_item
WHERE
catalogid = nCatalogId AND
express;
RETURN nCant;
END;
' LANGUAGE 'plpgsql';

Y luego agregué la constraint:
ALTER TABLE catalog_item ADD CONSTRAINT chk_express CHECK
(fu_check_express(catalogid)<=1);

Pero no funciona bien: la violación a la constraint es descubierta recién al
siguiente update que se haga en la tabla. Es decir, me permite tener 2 items
de un mismo catalog en true (eso está mal) y cuando quiero volver a hacer un
update sobre cualquier campo y/o registro (incluso campos que no están
involucrados en este tema) de la tabla, ya no me lo permite, porque se está
violando la constraint.
Se entiende lo que quiero hacer? Cómo se podría lograr?
Gracias.

>From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
>To: Guillermo Schulman <guillepsql(at)hotmail(dot)com>
>CC: Pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
>Subject: Re: [Pgsql-ayuda] Problemas para agregar una CONSTRAINT CHECK
>Date: Thu, 25 Sep 2003 11:32:36 -0400
>
>On Thu, Sep 25, 2003 at 03:24:41PM +0000, Guillermo Schulman wrote:
>
> > v3=# ALTER TABLE catalog_item ADD CONSTRAINT chk_express CHECK
> > (fu_check_express(catalogid)<1);
> > ERROR: AlterTableAddConstraint: rejected due to CHECK constraint
> > chk_express
>
>Te esta diciendo que alguna tupla viola la restriccion. Deberias
>corregirla antes de hacer el ADD CONSTRAINT:
>
>SELECT * from catalog_item WHERE NOT fu_check_express(catalogid) < 1;
>UPDATE ...
>
>--
>Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
>"No deja de ser humillante para una persona de ingenio saber
>que no hay tonto que no le pueda enseñar algo." (Jean B. Say)

_________________________________________________________________
Charla con tus amigos en línea mediante MSN Messenger:
http://messenger.yupimsn.com/

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Eduardo Gauna 2003-09-25 16:09:22 Re: [Pgsql-ayuda] Mensaje: pq_recvbuf:recv() failed: No error
Previous Message sandrigo lezcano 2003-09-25 15:58:41 [Pgsql-ayuda] WHERE campo_alias = 'algo'