Re: [Pgsql-ayuda] Contrains

From: Gunnar Wolf <gwolf(at)campus(dot)iztacala(dot)unam(dot)mx>
To: Jose Antonio Leo <jaleo8(at)storelandia(dot)com>
Cc: Pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: [Pgsql-ayuda] Contrains
Date: 2002-06-25 18:14:24
Message-ID: Pine.BSO.4.44.0206251309190.28868-100000@campus.iztacala.unam.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> 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ón - 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) = formula_elec(id_formula))
);

casilla_elec y formula_elec son dos funciones definidas por mí:

CREATE FUNCTION "formula_elec" (int2) RETURNS int2 AS
'SELECT id_elec FROM formula WHERE id_formula = $1'
LANGUAGE 'SQL';
CREATE FUNCTION "casilla_elec" (int2) RETURNS int2 AS
'SELECT id_elec FROM casilla WHERE id_casilla = $1 '
LANGUAGE 'SQL';

(Sí, sé que hay mucho mejores maneras de hacer esto, pero... Este
sistemita lo hice hace dos años, con muy someros conocimientos de
Postgres)

El constraint obliga a que cada que cambies algo en la tabla revise que
para ese renglón se siga cumpliendo la condición - en este caso, que el
id_elec de casilla corresponda con el id_elec de formula para la casilla y
la fórmula en cuestión. Si intento insertar datos que no correspondan,
Postgres no me lo permitirá:

# 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ón,
puedes hacer cosas bastante interesantes.

> 2.- Como puedo crear un campo decimal que se incremente automaticamente.?

No lo sé... Pero asómate a cómo lo hace 'serial' (que lo hace sobre un
campo entero). No debe ser difícil construir sobre de esta definición
(que, a fin de cuentas, es una función también)

--
Gunnar Wolf - gwolf(at)campus(dot)iztacala(dot)unam(dot)mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gunnar Wolf 2002-06-25 18:19:00 Re: [Pgsql-ayuda] Contrains
Previous Message Manuel Sugawara 2002-06-25 17:33:05 Re: [Pgsql-ayuda] Contrains