2010-07-29 10 views

Antwort

122

alte Frage, aber das Hinzufügen Antwort so, dass man

Sein zweistufiger Prozess erhalten helfen:

Angenommen, ein table1 hat einen Fremdschlüssel mit Spaltenname fk_table2_id, mit Einschränkung Name fk_name und table2 bezieht sich auf Tabelle mit Schlüssel t2 (so etwas wie unten in meinem Diagramm).

table1 [ fk_table2_id ] --> table2 [t2] 

Erster Schritt, DROP alt CONSTRAINT: (reference)

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

Hinweis Einschränkung gelöscht wird, Spalte

Zweiter Schritt nicht gelöscht wird, fügen Sie neue CONSTRAINT:

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

Zugabe Einschränkung, Spalte ist bereits dort

Beispiel:

Ich habe eine UserDetails Tabelle Users Tabelle verweist:

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

Erster Schritt:

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

Zweiter Schritt:

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) 

Ergebnis:

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

Danke, alte Frage, aber du hast Recht, die andere Antwort war ein bisschen kryptisch für mich zurück in den Tag. – Moak

+0

danke auch dir :) –

+1

Sollte die Einschränkung, die du hinzufügst, nicht ON DELETE RESTRICT sein, wie von der ursprünglichen Frage verlangt? – 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 ist die Spalte? – Moak

+2

hat mir geholfen, die Lösung zu finden 'ALTER TABLE Tabellenname ADD' ...' ON DELETE RESTRICT' – Moak

+2

Nein, fk_name ist der Constraint-Name. Es ist optional, eins zur Verfügung zu stellen. Ich bin mir nicht sicher, aber vielleicht können Sie es mit 'SHOW CREATE TABLE' abrufen. – pascal

9

Sie können dies in einer Abfrage tun wenn Sie bereit sind, seinen Namen zu ändern:

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

Dies ist nützlich, um Ausfallzeiten zu minimieren, wenn Sie eine große Tabelle haben.

3

Denken Sie daran, dass MySQL nach dem Löschen des Fremdschlüssels einen einfachen Index für eine Spalte behält.Also, wenn Sie auf 'Referenzen' Spalte ändern Sie es tun sollten in 3 Schritten

  • Tropfen original FK
  • einen Index fallen (Namen wie frühere fk, mit drop index Klausel)
  • schaffen neue FK
3

Sie können einfach eine Abfrage verwenden, um sie alle zu regieren: Name 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

Verwandte Themen