[Pgsql-ayuda] Contrains
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Tue, 25 Jun 2002 13:14:24 -0500 (CDT)
> Hola a todos tengo 2 preguntitas a ver soi me podeis ayudar.
> 1.- Para que sirve la clausula CONSTRAINT en la creacion de una tabla.?
Para que cada que hagas un insert/update/delete se verifique cierta
condici=F3n - Por ejemplo, tengo esta tabla:
CREATE TABLE "votos" (
"id_casilla" int2 NOT NULL,
"id_formula" int2 NOT NULL,
"num_votos" int2 NOT NULL,
PRIMARY KEY (id_casilla, id_formula),
CONSTRAINT cont1 CHECK (casilla_elec(id_casilla) =3D formula_elec(id=
_formula))
);
casilla_elec y formula_elec son dos funciones definidas por m=ED:
CREATE FUNCTION "formula_elec" (int2) RETURNS int2 AS
'SELECT id_elec FROM formula WHERE id_formula =3D $1'
LANGUAGE 'SQL';
CREATE FUNCTION "casilla_elec" (int2) RETURNS int2 AS
'SELECT id_elec FROM casilla WHERE id_casilla =3D $1 '
LANGUAGE 'SQL';
(S=ED, s=E9 que hay mucho mejores maneras de hacer esto, pero... Este
sistemita lo hice hace dos a=F1os, con muy someros conocimientos de
Postgres)
El constraint obliga a que cada que cambies algo en la tabla revise que
para ese rengl=F3n se siga cumpliendo la condici=F3n - en este caso, que el
id_elec de casilla corresponda con el id_elec de formula para la casilla y
la f=F3rmula en cuesti=F3n. Si intento insertar datos que no correspondan,
Postgres no me lo permitir=E1:
# insert into votos (id_casilla,id_formula,num_votos) values (2,11,5);
ERROR: ExecAppend: rejected due to CHECK constraint cont1
Y claro, siendo PL/PGSQL un lenguaje bastante completo de programaci=F3n,
puedes hacer cosas bastante interesantes.
> 2.- Como puedo crear un campo decimal que se incremente automaticamente.?
No lo s=E9... Pero as=F3mate a c=F3mo lo hace 'serial' (que lo hace sobre u=
n
campo entero). No debe ser dif=EDcil construir sobre de esta definici=F3n
(que, a fin de cuentas, es una funci=F3n tambi=E9n)
--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF