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