Supongamos que luego hemos iniciado un proyecto que involucra una base datos. Ya funciona el programa, busca/ingresa/edita/elimina datos como se suele hacer.
Luego nos damos que el programa comienza a dar síntomas extraños, como desplegar datos demás, mostrar datos cruzados, que no muestre lo que debería o derechamente nos tira errores. Entonces nos damos cuenta que la base datos es el problema, ya que hay datos cuyas relaciones se han quebrado por ingresar mal un dato, o borrar registros.
He acá la importancia de definir las restricciones ANTES de ocupar la base de datos.
Lo primero en que hay que fijarse es que nuestras «motor/bases de datos/tablas» soporten llaves foráneas. Mysql 5.0 lo soporta perfecto, usando tablas tipo InnoDB. Si no es así, se puede cambiar esto tanto en Mysql Query Browser como en PhpMyAdmin (los programas GUI que suelo ocupar con Mysql).
Luego, ocurrió que mientras añadía restricciones (mediante llaves foráneas) a las tablas, muchas veces el servidor Mysql me impedía hacerlo, arrojando un error que (aun dando mucha información) no ayuda mucho a encontrar el problema.
Es muy simple, Mysql no permite añadir restricciones a las tablas mientras los datos involucrados sean inconsistentes. Entonces la segunda tarea es limpiar las tablas de los registros que no funcionan. Lástima, es inevitable perder esos datos, pero tampoco aportan mucho, porque en sí no tienen ningún significado mientras tengan relaciones quebradas.
Luego, aunque parezca increíble, teniendo las tablas limpias (con datos, pero consistentes), me seguía arrojando el mismo error