Respuestas:
Pregunta anterior pero agregando respuesta para que uno pueda obtener ayuda
Su proceso de dos pasos:
Supongamos que a table1tiene una clave externa con nombre de columna fk_table2_id, con nombre de restricciónfk_name y table2se refiere a una tabla con clave t2( algo como a continuación en mi diagrama ).
table1 [ fk_table2_id ] --> table2 [t2]
Primer paso , ELIMINAR la vieja RESTRICCIÓN: ( referencia )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
aviso de restricción se elimina, la columna no se elimina
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;
agregando restricción, la columna ya está allí
Ejemplo:
Tengo una UserDetailstabla se refiere a la Userstabla:
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
:
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.
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
ALTER TABLE table_name ADD...ON DELETE RESTRICT
SHOW CREATE TABLE.
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
drop indexcláusula de uso )Simplemente puede usar una consulta para gobernarlos a todos:
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
Tenía que modificar un montón de FK, así que escribí algo para hacer las declaraciones por mí. Pensé que compartiría:
SELECT
CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` DROP FOREIGN KEY `' ,rc.CONSTRAINT_NAME,'`;')
, CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` ADD CONSTRAINT `' ,rc.CONSTRAINT_NAME ,'` FOREIGN KEY (`',kcu.COLUMN_NAME,
'`) REFERENCES `',kcu.REFERENCED_TABLE_NAME,'` (`',kcu.REFERENCED_COLUMN_NAME,'`) ON DELETE CASCADE;')
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE DELETE_RULE = 'NO ACTION'
AND rc.CONSTRAINT_SCHEMA = 'foo'