[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Postgresql-it] check



tanto per chiacchierare, invece di fare un count(*), ti dovrebbe essere meglio fare:

	select into x id from capitoli where ecc. limit 1;
	if not fount then
		...

non so se il "limit 1" serva, ma in ogni caso questa query è più efficiente perché invece di scorrersi tutti i capitoli, si ferma al primo buono che trova.
m.



Nicola Alessi wrote:

Allora, un esempio (anche senza fischio):

Supponiamo di avere: - una tabella dei capitoli di un libro, contenente pagina iniziale,
finale e nome del capitolo;
- una tabella dei paragrafi di un libro, contenente pagina del paragrafo
e nome del paragrafo; il check da forzare su questa tabella è che esista
un capitolo che comprenda quella pagina.

Schema:

CREATE TABLE capitoli (
   pag_finale integer NOT NULL,
   pag_iniziale integer NOT NULL,
   nome character varying(30) NOT NULL
) WITHOUT OIDS;

CREATE TABLE paragrafi (
   nome character varying(30) NOT NULL,
   pagina integer NOT NULL
) WITHOUT OIDS;

Trigger/Funzioni:
(devi creare una funzione che contenga il codice da eseguire, e poi un
trigger che lanci la funzione)

CREATE FUNCTION check_paragrafi () RETURNS "trigger"
   AS '
   declare
   rowcount INT4;
   BEGIN
       -- Verifica se esiste una riga di capitoli che comprende la
pagina
       select count(*) into rowcount from capitoli where
pag_iniziale<=new.pagina and pag_finale>=new.pagina;

       IF rowcount=0 THEN
           -- se non esiste, lancia l'eccezione e restituisce null per
non bloccare l'insert o l'update
           RAISE EXCEPTION ''check fallito'';
           RETURN NULL;
       END IF;

       RETURN NEW;
   END;
'
   LANGUAGE plpgsql;


CREATE TRIGGER check_paragrafi
   BEFORE INSERT OR UPDATE ON paragrafi
   FOR EACH ROW
   EXECUTE PROCEDURE check_paragrafi ();


Qualche dato di prova...

COPY capitoli (pag_finale, pag_iniziale, nome) FROM stdin;
5       1       Primo
9       5       Secondo
19      10      Terzo

Se provi ad inserire un dato tipo
  insert into paragrafi values ('Primo.1',3);
va tutto bene.

Viceversa se tenti
  insert into paragrafi values ('Primo.1',30);
non viene eseguito l'insert.


Spero ti serva.





Il gio, 2004-11-11 alle 17:49, Hypericum ha scritto:
grazie in anticipo per l'aiuto...
sto lavorando ad un progetto che stasera si è bloccato alla scoperta
del fatto che, a differenza di sql, in postgres non posso fare
controlli su subselect all'interno dei check (in create table per
intenderci)
ora: io ho dei dati che devono essere controllati prima
dell'inserimento e la loro validità o meno dipende dai valori di altre
tabelle (o anche della stessa, ad esempio controllo che non ci sia già
un altro valore di quel tipo con select count). come posso fare? i
trigger se non ho capito male fanno al caso mio ma non riesco a capire
bene come funzionano.
grazie ancora
maria


----
Email.it, the professional e-mail, gratis per te: clicca qui

Sponsor:
Qui trovi tutti i manuali che vuoi, clicca e scegli quello più adatto
a te
Clicca qui

_______________________________________________
Postgresql-it mailing list
Postgresql-it@xxxxxxxxxxxxxxxxx
http://www.linuxtime.it/mailman/listinfo/postgresql-it