44 Stimmen

Wie verwende ich eine Löschkaskade in mysql?

Ich habe eine Datenbank mit Komponenten. Jede Komponente ist von einem bestimmten Typ. Das bedeutet, dass es eine Beziehung zwischen einer Komponente und einem Typ gibt. Wenn ich einen Typ lösche, möchte ich alle Komponenten löschen, die einen Fremdschlüssel dieses Typs haben. Aber wenn ich mich nicht irre, löscht die Kaskadenlöschung den Typ, wenn die Komponente gelöscht wird. Gibt es eine Möglichkeit, das zu tun, was ich beschrieben habe?

59voto

nickf Punkte 517253

Die folgenden Angaben würden Sie in Ihre Komponententabelle aufnehmen.

CREATE TABLE `components` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `typeId` int(10) unsigned NOT NULL,
    `moreInfo` VARCHAR(32), 
    -- etc
    PRIMARY KEY (`id`),
    KEY `type` (`typeId`)
    CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
      REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)

Denken Sie nur daran, dass Sie die InnoDB-Speicher-Engine verwenden müssen: Die Standard-MyISAM-Speicher-Engine unterstützt keine Fremdschlüssel.

5 Stimmen

N.B., ON UPDATE CASCADE ist wahrscheinlich eine schlechte Idee, wenn Sie es verwenden, um einen Primärschlüssel zu verknüpfen, weil es unveränderlich sein sollte und auf diese schlägt Datenbank erfordern könnte Redesign, aber ich denke, wenn Sie es mit einem Fremdschlüssel verknüpfen, die eindeutig ist, aber nicht primär es ist ok.

5voto

md asif rahman Punkte 379

Verwenden Sie diese sql

DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.Schlüssel = T2.Schlüssel WHERE Bedingung

0 Stimmen

Dies verwendet nicht die CASCADE Funktionalität wie von op. gewünscht.

12 Stimmen

Aber es löst das Problem, ohne die bestehende Datenbankstruktur zu aktualisieren.

0 Stimmen

Können Sie diese Antwort näher erläutern? Werden dadurch die Zeilen von T1 und T2 gelöscht? Spielt die Reihenfolge bei "T1 INNER JOIN T2" eine Rolle?

2voto

Silambarasan Punkte 717

Sie müssen Ihre Fremdschlüssel-Beschränkungen als ON DELETE CASCADE definieren.

Note : Sie müssen die InnoDB-Speicher-Engine verwenden, da die Standard-MyISAM-Speicher-Engine keine Fremdschlüsselbeziehungen unterstützt.

CREATE TABLE `table2` (
`id` int(11) NOT NULL auto_increment,
`name` int(11) NOT NULL,

PRIMARY KEY (`id`),
KEY `ids` (`ids`)
CONSTRAINT `foreign` FOREIGN KEY (`ids`)
  REFERENCES `table2` (`ids`) ON DELETE CASCADE ON UPDATE CASCADE
)

0voto

Nazmul Haque Punkte 392
Step 1. Create the buildings table:

CREATE TABLE buildings (
  building_no INT PRIMARY KEY AUTO_INCREMENT,
  building_name VARCHAR(255) NOT NULL,
  address VARCHAR(255) NOT NULL
);

Step 2. Create the rooms table:

CREATE TABLE rooms (
  room_no INT PRIMARY KEY AUTO_INCREMENT,
  room_name VARCHAR(255) NOT NULL,
  building_no INT NOT NULL,
  FOREIGN KEY (building_no)
    REFERENCES buildings (building_no)
    ON DELETE CASCADE
);

Notice that the ON DELETE CASCADE  clause at the end of the foreign key constraint 
definition.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X