Come controllare i constraints di mySQL

A quale sviluppatore non è mai capitato il bellissimo errore mysql Cannot delete or update a parent row: a foreign key constraint fails ? Ok, suppongo sia capitato a tutti. Dopo aver esaurito le liste di santi dei calendati dell’ultima decade (soprattutto se si ha un database con molte relazioni innodb), scoprirete che ci sono un paio di comandi che risolveranno facilmente il problema.

Con questa query si vede subito quali sono le tabelle che eventualmente impediscono la modifica e/o l’eliminazione di dati dalla tabella che ci interessa
use INFORMATION_SCHEMA;
select * from KEY_COLUMN_USAGE where TABLE_SCHEMA = "nome_database"
and REFERENCED_TABLE_NAME = "nome_tabella";

e quindi possiamo procedere a rimuovere manualmente i dati collegati, oppure modificare il vincolo di chiave esterna (foreign key) da restrict a cascade. Fatto ciò si potrà procedere con le successive operazioni sulla nostra casa “nome_tabella”.

Come dicevo all’inizio, esiste un altro comando mysql magico (e dico magico perchè tanti usano solo phpmyadmin ignorando la shell) per chiedere a mySQL esplicitamente di mostrarci i dettagli dell’errore, altrimenti riceviamo solo il messaggio generico di cui sopra, con buona pace del cornuto che ha deciso questo funzionamento. Eccolo:show errors;

Se invece vogliamo vedere se e quali relazioni ha una tabella innodb verso le altre, il comando da dare è questo: select * from KEY_COLUMN_USAGE where TABLE_SCHEMA = "nome_database" and TABLE_NAME = "nome_tabella";
In pratica è lo stesso comando mysql di prima, ma cambia il campo da REFERENCED_TABLE_NAME a TABLE_NAME.

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">