Ho migrato l’ultimo database realizzato da MySQL a PostgreSQL per 1 solo motivo, sufficiente però a dimostrare la correttezza del claim di PGSQL: “Il più avanzato database open-source esistente”: non è possibile in MySQL creare un trigger (ossia una funzione che viene eseguita ad ogni inserimento/aggiornamento/cancellazione di un record) che modifichi il risultato della query eseguita (almeno io non ci sono riuscito e ho trovato reperti su vari siti che dicono che non si può farlo, da parecchio tempo).
La funzione di questo trigger è di numerare progressivamente le righe inserite dall’1 in avanti, tenendo conto che si tratta di una sub-form, per cui l’id dei record non è utile.

Il trigger su PGSQL è il seguente:
CREATE OR REPLACE FUNCTION edil.incr_pos()
RETURNS trigger AS
$BODY$
DECLARE
v_pos RECORD;
rec integer;
BEGIN
SELECT pos INTO v_pos FROM edil.prev_articoli
WHERE id_prev_prodotti = NEW.id_prev_prodotti
ORDER BY pos DESC LIMIT 1;
rec := v_pos.pos+1;
IF rec IS NULL THEN
rec = 1;
END IF;
NEW.pos := rec;
RETURN NEW;
END

e funziona tranquillamente.
Mentre l’equivalente in MySQL no:
CREATE TRIGGER `edil`.`pos_prod`
BEFORE INSERT ON `edil`.`prev_prodotti`
FOR EACH ROW
BEGIN
SET NEW.pos = (SELECT MAX(prev_prodotti.pos) FROM edil.prev_prodotti AS prev_prodotti )+ 1;
END

(certo l’aspetto è un po’ diverso 😉 )

Questo dimostrerebbe che MySQL non ha aggiornamenti di sviluppo, ma solo di mantenimento.

1 thought on “Da MySQL a PostgreSQL: perché?

  1. A dir la verità, era solo una scusa per provare PGSQL 😎 , perchè funziona come scritto sotto anche in MySQL (ma non con la funzione di gruppo MAX):

    DELIMITER $$

    USE `edil`$$

    CREATE
    DEFINER=`edil`@`localhost`
    TRIGGER `edil`.`pos_prod`
    BEFORE INSERT ON `edil`.`prev_prodotti`
    FOR EACH ROW
    BEGIN
    SET NEW.pos = (SELECT prev_prodotti.pos FROM edil.prev_prodotti AS prev_prodotti
    WHERE id_prev = NEW.id_prev ORDER BY prev_prodotti.pos DESC LIMIT 1)+ 1;
    END$$

Comments are closed.