2010-07-29 18 views

Respuesta

122

pregunta antiguo, pero la adición de respuesta de modo que uno puede obtener ayuda

Su proceso de dos pasos:

Supongamos, un table1 tiene una clave externa con el nombre de columna fk_table2_id, con restricción nombre fk_name y table2 Se hace referencia a la tabla con la clave t2 (algo como abajo en mi diagrama).

table1 [ fk_table2_id ] --> table2 [t2] 

Primer paso, Gota de edad restricción: se elimina (reference)

ALTER TABLE `table1` 
DROP FOREIGN KEY `fk_name`; 

aviso de restricción, la columna no se elimina

Segundo paso, añadir nuevos RESTRICCIÓN:

ALTER TABLE `table1` 
ADD CONSTRAINT `fk_name` 
    FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE; 

adición de restricción, la columna es ya allí

Ejemplo:

Tengo una tabla UserDetails se refiere a Users tabla:

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 
: 
+1

Gracias, vieja pregunta, pero tiene razón, la otra respuesta fue un poco críptica para mí en el día. – Moak

+0

gracias a ti también :) –

+1

¿No debería la restricción que agregas estar EN ELIMINAR RESTRICTO según lo solicitado por la pregunta original? – Noumenon

10
ALTER TABLE DROP FOREIGN KEY fk_name; 
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols) 
      REFERENCES tbl_name(pk_names) ON DELETE RESTRICT; 
+0

FK_NAME es el nombre de la columna? – Moak

+2

me ayudó a encontrar la solución 'ALTER TABLE table_name ADD' ...' ON DELETE RESTRICT' – Moak

+2

No, fk_name es el nombre de la restricción. Es opcional proporcionar uno. No estoy seguro pero quizás puedas recuperarlo usando 'SHOW CREATE TABLE'. – pascal

9

Usted puede hacer esto en una consulta si que 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.

3

Recuerde que MySQL mantiene un índice simple en una columna después de eliminar la clave externa.Por lo tanto, si necesita cambiar la columna 'referencias' debe hacerlo en 3 pasos

  • caída original, FK
  • soltar un índice (nombres como FK anterior, utilizando drop index cláusula)
  • crear nuevos FK
3

Usted puede simplemente utilizar 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

Cuestiones relacionadas