[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