[Pgsql-ayuda] Problemas para agregar una CONSTRAINT CHECK

Guillermo Schulman guillepsql@hotmail.com
Thu, 25 Sep 2003 15:59:25 +0000


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@dcc.uchile.cl>
>To: Guillermo Schulman <guillepsql@hotmail.com>
>CC: Pgsql-ayuda@tlali.iztacala.unam.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/