[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