Corsi on-line

DELETE cumulativi su più tabelle in MySQL

Un problema che si verifica abbastanza spesso nella gestione dei database relazionali riguarda la cancellazione di record presenti in più tabelle tramite un’unica istruzione; utilizzare uno statement DELETE per ciascuna delle tabelle coinvolte potrebbe infatti rivelarsi scomodo nel caso in cui queste ultime dovessero essere particolarmente numerose. I DELETE cumulativi rappresentano quindi una soluzioni ottimale per risparmiare tempo e lavoro, tenendo però conto del fatto che si tratta di procedure particolarmente rischiose se non operate con estrema attenzione.

MySQLChiaramente, per poter sottoporre più tabelle a questo tipo di istruzioni sarà necessario che tra i record destinati all’eliminazione vi siano degli elementi di relazione, solitamente questi sono rappresentati da degli identificatori; gli “id” si rivelano utili in particolare quando non di dispone di foreign keys, cioè delle chiavi esterne che possano offrire un un vincolo di integrità tra due o più tabelle.

Nel caso delle foreign keys, infatti, sarebbe possibile sfruttare un meccanismo basato sulle referenze per il quale uno o più campi di una tabella fanno riferimento a uno o più campi di un’altra tabella; in presenza di chiavi esterne i valori di un record dei campi che stabiliscono la referenza dovranno essere presenti in un singolo record della tabella referenziata (relazione uno a molti), ne consegue che un record della prima tabella non potrà contenere valori non presenti nella seconda.

Ora si ipotizzi invece di disporre di due tabelle il cui unico vincolo di relazione sia dato dai classici identificatori autoincrementali definiti come PRIMARY KEY, nel caso specifico si potrebbero rimuovere tutti i record che corrispondono a questo criterio di uguaglianza:

DELETE a.*, b.* 
FROM tab_1 AS a, TAB_2 AS b
WHERE a.ida = b.ida
AND a.ida = 10;

In sostanza, verranno creati degli ALIAS (“a” e “b”) associati alle due tabelle interessate (“tab_1” e “tab_2”), fatto questo tali riferimenti verranno utilizzati per cancellare tutti i record della prima e della seconda tabella che presentano un’uguaglianza tra le chiave primaria della prima e il suo identificativo di relazione della seconda. La cancellazione dei record avverrà soltanto in presenza di una specifica identità tra la PRIMARY KEY della prima tabella e un valore definito dall’utilizzatore.

L’esempio proposto in precedenza potrebbe essere implementato in modo da coinvolgere un maggior numero di tabelle, come nel caso seguente:

DELETE a.*, b.*, c.*
FROM tab_1 AS a, tab_2 AS b, tab_3 AS c
WHERE a.ida = b.ida
AND b.idb = c.idb
AND a.ida = 10;

L’ultima istruzione riportata riproduce la situazione in cui il DELETE coinvolge tre diverse tabelle, dove gli ALIAS verranno utilizzati per cancellare i record della prima e della seconda tabella che presentano un’uguaglianza tra le chiave primaria della prima e il suo identificativo di relazione della seconda, saranno eliminati anche tutti quelli della seconda e della terza che presentano un’uguaglianza tra le chiave primaria della seconda e il suo identificativo di relazione della terza. Rimane invece stabile il vincolo di uguaglianza tra la PRIMARY KEY della prima tabella e il valore definito in sede di scrittura della query.

Post correlati
I più letti del mese
Tematiche