wake-up-neo.com

Wie kann die referenzielle Aktion des Fremdschlüssels geändert werden? (Verhalten)

Ich habe eine Tabelle mit einer Spalte mit einem Fremdschlüssel eingerichtet, die auf ON DELETE CASCADE gesetzt ist (untergeordnetes Element löschen, wenn das übergeordnete Element gelöscht wird) 

Was wäre der SQL-Befehl, um dies in ON DELETE RESTRICT zu ändern? (kann Eltern nicht löschen, wenn sie Kinder hat)

77
Moak

Alte Frage, aber Antwort hinzufügen, damit man Hilfe bekommen kann

Sein zweistufiger Prozess: 

Angenommen, ein table1 hat einen Fremdschlüssel mit dem Spaltennamen fk_table2_id, mit Einschränkung name fk_name und table2 ist eine Tabelle mit dem Schlüssel t2 (etwas in meinem Diagramm). 

   table1 [ fk_table2_id ] --> table2 [t2]

Erster Schritt, DROP old CONSTRAINT: ( reference

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

Hinweisbeschränkung wird gelöscht, Spalte wird nicht gelöscht

Zweiter Schritt, Neue CONSTRAINT HINZUFÜGEN: 

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

Hinzufügen von Einschränkungen, Spalte ist bereits vorhanden

Beispiel: 

Ich habe eine UserDetails-Tabelle, die auf 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
:
139
Grijesh Chauhan

Sie können dies in einer Abfrage tun wenn Sie möchten ihren Namen ä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.

12
Romuald Brunet
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
            REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
10
pascal

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

3
stamster

Denken Sie daran, dass MySQL nach dem Löschen eines Fremdschlüssels einen einfachen Index für eine Spalte führt. Wenn Sie also die Spalte "Verweise" ändern müssen, sollten Sie dies in drei Schritten tun

  • original-FK ablegen
  • einen Index löschen (Namen wie vorige fk mit drop index-Klausel)
  • neues FK erstellen
3
Vasiliy

Ich hatte ein paar FKs zu ändern, also schrieb ich etwas, um die Aussagen für mich zu treffen. Ich dachte, ich würde teilen:

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'
0
DavidSM