2010-07-29 13 views

risposta

122

vecchia questione, ma l'aggiunta di risposta in modo che si può ottenere aiuto

Il suo processo in due fasi:

Supponiamo, un table1 ha una chiave esterna con nome colonna fk_table2_id, con vincolo nome fk_name e table2 è riferito tabella con chiave t2 (qualcosa di simile nel mio schema).

table1 [ fk_table2_id ] --> table2 [t2] 

Primo passo, Goccia vecchio vincolo: (reference)

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

preavviso vincolo viene eliminato, colonna non viene eliminato

Secondo passo, aggiungere nuovi CONSTRAINT:

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

aggiungendo vincolo, colonna c'è già

Esempio:

Ho una tabella UserDetails riferisce a Users tabella:

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`) 
: 
: 

Primo passo:

mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`; 
Query OK, 1 row affected (0.07 sec) 

Secondo passo:

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) 

risultato:

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

Grazie, vecchia domanda ma hai ragione, l'altra risposta è stata un po 'criptica per me nel corso della giornata. – Moak

+0

grazie anche a te :) –

+1

Non dovrebbe il vincolo che aggiungi essere ON DELETE RESTRICT come richiesto dalla domanda originale? – 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 è il nome della colonna? – Moak

+2

mi ha aiutato a trovare la soluzione 'ALTER TABLE nome_tabella AGGIUNGI' ... 'ON ELIMINA RISTRICE' – Moak

+2

No, nome_fk è il nome del vincolo. È facoltativo fornirne uno. Non sono sicuro ma forse puoi recuperarlo usando 'SHOW CREATE TABLE'. – pascal

9

È possibile farlo in una query se siete disposti a cambiare il suo nome:

ALTER TABLE table_name 
    DROP FOREIGN KEY `fk_name`, 
    ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`) 
    REFERENCES `other_table` (`id`) 
    ON DELETE CASCADE; 

Questo è utile per ridurre al minimo i tempi di inattività se si dispone di una tabella di grandi dimensioni.

3

Ricordare che MySQL mantiene un indice semplice su una colonna dopo aver eliminato la chiave esterna.Quindi, se è necessario modificare la colonna 'Riferimenti' si dovrebbe fare in 3 passi

  • goccia originale FK
  • eliminare un indice (nomi come fk precedente, utilizzando drop index clausola)
  • creare nuova FK
3

si può semplicemente utilizzare una query per domarli tutti: 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