[Pgsql-ayuda] Rules para el evento delete

Alvaro Herrera alvherre@dcc.uchile.cl
Tue, 11 Nov 2003 14:43:50 -0300


On Tue, Nov 11, 2003 at 11:10:31AM -0800, Dimas Ayala wrote:
Dimas,

> Buenas tengo una DB para el modulo de cuentas por cobrar.
> ya logre hacer el ruler que cuando se actualice el idcliente lo haga tambien
> con los documentos de este.

Los ID, si son llaves primarias, no deberían ser actualizados nunca
(sólo insert y delete).  Es bastante peligroso para el modelo; agregas
fragilidad sin ganar nada a cambio.

> Pero ahora quiero impedir que se elimine e idcliente si existen mov en la
> tabla ccdocum

Con respecto a eliminar los IDs, necesitas crear llaves foráneas:

CREATE TABLE clientes_d (
	idcliente char(9) PRIMARY KEY
);

CREATE TABLE ccdocum (
	idcliente char(9) REFERENCES clientes_d ON DELETE RESTRICT
);

regression=> insert into clientes_d values ('abcdehj');
INSERT 68569272 1
regression=> insert into ccdocum values ('abcasd');
ERROR:  inserción o actualización en la tabla "ccdocum" viola la llave foránea "$1"
DETAIL:  La llave (idcliente)=(abcasd   ) no está presente en la tabla "clientes_d".
regression=> insert into ccdocum values ('abcdehj');
INSERT 68569274 1
regression=> delete from clientes_d ;
ERROR:  update o delete en "clientes_d" viola la llave foránea "$1" en "ccdocum"
DETAIL:  La llave (idcliente)=(abcdehj  ) todavía es referida desde la tabla "ccdocum".

BTW, te aconsejo que no uses char(9) para llaves primarias.  Es más
lento que INTEGER.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Si quieres ser creativo, aprende el arte de perder el tiempo"