lunes, 20 de octubre de 2014

Deshabilitar el Check Foreign Key de MYSQL

En algunas oportunidades es necesario hacer este tipo de cosas, pero no recomendado pues se pierde un poco la persistencia de la información o diria toda la persistencia de la información si es que no se usa adecuadamente.Es un arma de doble filo.

Cuando trabajamos con MySQL, en nuestras tablas podemos definir llaves foráneas,  para hacer referencia a otras tablas. En general MySQL, en declaraciones SQL como 'insert', 'delete' o 'update' se verifican las restricciones UNIQUE y las FOREIGN KEY fila por fila, para así mantener la consistencia de los datos. Existen ocasiones muy particulares donde deseamos que esta revisión no se lleve a cabo, supongamos que contamos con el siguiente esquema de base de datos:
?
Esquema de base de datos
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE roles (
Id INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(200) NOT NULL UNIQUE
);
 
CREATE TABLE users (
Id INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(200) NOT NULL UNIQUE,
IdRole INT NOT NULL,
CONSTRAINT fk_user_role FOREIGN KEY (IdRole)
REFERENCES Roles(Id)
);
Ahora revisaremos con "SHOW TABLES", y observaremos que existen las dos tablas recientemente creadas (roles, users), se muestra a continuación:
Entonces, a continuación agregaremos unos datos de pruebas, primero en la tabla de "roles" para luego crear unos usuarios y relacionarlos con un rol específico, podemos utilizar el siguiente código:
?
Agregando datos
1
2
INSERT INTO roles (Name) VALUES ('Admin'), ('User'), ('Anonymous');
INSERT INTO users (Name, IdRole) VALUES ('User1', 1), ('User2', 2), ('User3', 3);
Una vez con la información ingresada, si nos solicitan eliminar la tabla 'roles' podríamos utilizar la instrucción "DROP TABLE", pero si al hacerlo obtendremos un error del sistema, puesto que existen campos referenciando a los campos de la tabla 'roles' que se esta intentando borrar, el error seria similar al presentado a continuación:
?
DROP TABLE roles
1
2
3
4
DROP TABLE roles;
 
-- ERROR 1217 (23000):
-- Cannot delete or update a parent row: a foreign key constraint fails
Para estos casos en particular, necesitamos que MySQL no revise las restricciones de llaves foráneas para lograr cumplir con la tarea que nos han solicitado, entonces para estos casos vamos a indicarle a MySQL que no revise las restricciones utilizando la siguiente declaración:
?
Evita revisar restricciones de llaves foráneas
1
SET FOREIGN_KEY_CHECKS=0;
Advertencia esta exclusión de la verificación se aplica para todas las tablas, se recomienda colocar el sistema en mantenimiento o colocar a los usuario diferentes al administrador para que ingresen al sistema solo en modo lectura.
Una vez hecho esto, podemos eliminar la tabla sin problema alguno, ahora bien, no debemos olvidar volver a configurar nuevamente MySQL para que continúe revisando las restricciones de llaves foráneas, el código se puede ver como se muestra a continuación:
?
Eliminar tabla y habilita revisar restricciones de llaves foráneas
1
2
DROP TABLE roles;
SET FOREIGN_KEY_CHECKS=1;
Es necesario ingresar la información necesaria para que los foreign keys cumplan con las restricciones antes de habilitarlo y de esta forma mantener la consistencia de los datos.
Ahora si revisamos nuevamente con "SHOW TABLES", veremos que solamente queda la tabla llamada "users", como se observa en la imagen:
Espero que les sea de mucha ayuda, para situaciones particulares como estas, 
Saludos,
- See more at: http://7sabores.com/blog/evitar-la-revision-restriccion-llaves-foraneas-mysql#sthash.E9hNNFPm.dpuf

No hay comentarios:

Publicar un comentario