[Db] contatore server side

Marcello Vezzelli marcello a vezz.it
Mar 30 Gen 2007 13:12:10 CET


Ciao a tutti,
scusate se riapro un thread non nuovissimo ma volevo postare 
l'implementazione che alla fine ho deciso di fare...
penso che possa servire come spunto.

Creo una semplice tabella fatture:

CREATE TABLE fatture (
id INT NOT NULL DEFAULT 0,
anno INT NOT NULL DEFAULT 0,
descr VARCHAR( 50 ) NOT NULL DEFAULT '',
PRIMARY KEY ( id , anno )
) ENGINE = innodb;

Creo un trigger in before insert che chiama la procedura get_counter, 
passando l'anno di riferimento:

CREATE TRIGGER new_fattura BEFORE INSERT on fatture
for each row set NEW.id = get_counter(NEW.anno);

La procedura get_counter appende un record in una tabella di supporto e 
ne ritorna il valore autoincrementante.

delimiter //
DROP FUNCTION IF EXISTS get_counter //
CREATE FUNCTION get_counter( myanno INT )
RETURNS INT
BEGIN
    CASE myanno
        WHEN 2006 THEN BEGIN INSERT INTO conta2006 VALUES (0); RETURN 
(LAST_INSERT_ID()); END;
        WHEN 2007 THEN BEGIN INSERT INTO conta2007 VALUES (0); RETURN 
(LAST_INSERT_ID()); END;
        WHEN 2008 THEN BEGIN INSERT INTO conta2008 VALUES (0); RETURN 
(LAST_INSERT_ID()); END;
        ELSE RETURN (0);
    END CASE;
end //
delimiter ;

Le tabelle di supporto le devo creare cosė:

CREATE TABLE IF NOT EXISTS conta2006 (id INT NOT NULL AUTO_INCREMENT 
PRIMARY KEY) ENGINE = innodb;
CREATE TABLE IF NOT EXISTS conta2007 (id INT NOT NULL AUTO_INCREMENT 
PRIMARY KEY) ENGINE = innodb;
CREATE TABLE IF NOT EXISTS conta2008 (id INT NOT NULL AUTO_INCREMENT 
PRIMARY KEY) ENGINE = innodb;

Alcune osservazioni...

Avevo messo la create table dentro alla procedura get_counter, ma mysql 
mi dice picche (non si possono creare tabelle in un trigger).
Il CASE myanno č ridicolo... ma pare non si possa usare una variabile 
come nome tabella.

Con questa query:

INSERT INTO fatture (anno,descr) VALUES (2006,'prima fattura');
INSERT INTO fatture (anno,descr) VALUES (2006,'seconda fattura');
INSERT INTO fatture (anno,descr) VALUES (2007,'prima fattura');

Le fatture vengono create correttamente come 1/2006,2/2006,1/2007.

Peccato che non sono riuscito ad ottenere l'id della fattura appena 
inserita... in questo caso last_insert_id() non funziona (la tabella 
fatture non contiene autoincrementanti).
Bisogna quindi estrarre il valore id con una query, l'isolamento della 
transazione garantisce che č proprio quella che abbiamo inserito noi.

A voi la palla.

Saluti
Marcello







Maggiori informazioni sulla lista Db