MySQL Vs PostgreSQL: sequenze a confronto

Come sempre in questo periodo (fino a domani,giorno di consegna),sono impegnato nel progetto di basi di dati (che poi pubblicherò),il quale coinvolge PHP e PostgreSQL. Devo dire che PostgreSQL è un buon DBMS,ho approfondito le procedure SQL e i trigger tramite funzioni PLPGSQL.
Una nota dolente è stata la scoperta della gestione delle sequenze: mentre per MySQL possiamo definire così una sequenza (per esempio):

id int auto_increment primary key
In PostgreSQL ci sono due modi (uno rapido e uno più elaborato). Modo rapido:

/* il seguente codice crea implicitamente una sequenza,creiamo il campo id nella tabella omettendo alcuni passaggi */
id serial primary key
E un modo più elaborato (vedi funzioni per le sequenze):

CREATE SEQUENCE tablename_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647;
-- creiamo il campo id nella tabella omettendo alcuni passaggi
id int DEFAULT nextval('tablename_id_seq') primary key
E fin qua ci siamo. Ammettiamo che facciamo una serie di INSERT specificando gli ID:

INSERT INTO table (ID,BLA,BLA) VALUES(1,'dato','dato');
In questo caso, dopo tali INSERT, se facciamo un inserimento SENZA specificare l'ID, MySQL sarà abbastanza scaltro da prelevare l'ultimo ID nella tabella e incrementarlo di uno mentre invece PostgreSQL richiamerà la sequenza creata (o quella implicita se usiamo serial),siccome non l'abbiamo mai usata, produrrà 1 come risultato,con la possibilità molto facile di causare un errore di duplicazione delle chiavi (1 è magari già presente nella tabella).
Per questo concludo dicendo che in PostgreSQL è bene non specificare gli ID ma lasciare che sia la sequenza a farlo per noi,mentre in MySQL non ci sono problemi di sorta.

2 comments:

Anonimo ha detto...

Grande! proprio cio' di cui avevo bisogno.
thankz

ilViandante

Christian ha detto...

@Anonimo: felice di esserti stato d'aiuto.

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger