mysql - tipos - ¿Cómo cambiar la acción referencial de la clave foránea?(comportamiento)
tipos de restricciones en base de datos (5)
Puede hacer esto en una consulta si está dispuesto a cambiar su nombre:
ALTER TABLE table_name
DROP FOREIGN KEY `fk_name`,
ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
REFERENCES `other_table` (`id`)
ON DELETE CASCADE;
Esto es útil para minimizar el tiempo de inactividad si tiene una mesa grande.
He configurado una tabla que contiene una columna con una clave externa, configurada en ON DELETE CASCADE
(eliminar hijo cuando se elimina el elemento primario)
¿Cuál sería el comando SQL para cambiar esto a ON DELETE RESTRICT
? (no se puede eliminar el padre si tiene hijos)
Recuerde que MySQL mantiene un índice simple en una columna después de eliminar la clave externa. Entonces, si necesita cambiar la columna ''referencias'', debe hacerlo en 3 pasos
- soltar FK original
- soltar un índice (nombres como fk anterior, usando la cláusula
drop index
) - crear nuevo FK
Simplemente puede usar una consulta para gobernarlas todas: ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE
Pregunta anterior pero agregando respuesta para que uno pueda obtener ayuda
Su proceso de dos pasos:
Supongamos que una table1
tiene una clave externa con el nombre de la columna fk_table2_id
, con el nombre de la restricción fk_name
y la table2
se refiere a la tabla con la clave t2
( algo como lo que se muestra a continuación en mi diagrama ).
table1 [ fk_table2_id ] --> table2 [t2]
Primer paso , DROP old CONSTRAINT: ( reference )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
la restricción de aviso se borra, la columna no se borra
Segundo paso , AGREGUE una nueva RESTRICCIÓN:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
añadiendo restricción, la columna ya está allí
Ejemplo:
Tengo una tabla UserDetails
se refiere a la tabla de Users
:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`)
:
:
Primer paso:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)
Segundo paso:
mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id`
-> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE;
Query OK, 1 row affected (0.02 sec)
resultado:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES
`Users` (`User_id`) ON DELETE CASCADE
:
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;