/ / Ich möchte, dass ein Trigger aus 2 Tabellen in MySQL gelöscht wird - mysql, trigger, sql-delete

Ich möchte einen Trigger aus 2 Tabellen in MySQL löschen - mysql, triggers, sql-delete

Ich habe 3 MySQL-Tabellen (food, apple, und orange).

Ich möchte Zeilen löschen aus:

apple(idapple, iduser, name)
orange(idornge, iduser, name)

Beim Löschen einer Zeile in food(iduser, name) einen Auslöser verwenden?

Hier ist mein Abzug bisher:

  CREATE TRIGGER `food_before_delete`

AFTER DELETE ON `food`
FOR EACH ROW

DELETE FROM apple, orange
WHERE
apple.iduser=OLD.iduser and
orange.iduser=OLD.iduser

Es wird jedoch nicht kompiliert. Wie kann ein Trigger erstellt werden, der gleichzeitig aus zwei Tabellen gelöscht wird?

Antworten:

24 für die Antwort № 1

Mit einem Trigger aus zwei Tabellen gleichzeitig löschen:

Auslöser werden verwendet, um die Datenintegrität in den Tabellen durchzusetzen. Sie können Trigger zum Löschen aus einer beliebigen Anzahl von Tabellen gleichzeitig verwenden.

Vor der Initialisierung von Triggern müssen wir den mysql-Begrenzeroperator vorübergehend ändern, da die Trigger Semikolon verwenden ; Operator, um mehrere SQL-Befehle innerhalb des Triggers anzugeben.

Schritt 1 Trennzeichen ändern:

delimiter $$

Schritt 2 Trigger erstellen:

CREATE TRIGGER `blog_before_delete`
AFTER DELETE ON `blog`
FOR EACH ROW
BEGIN
DELETE FROM blog_tags where blogid = OLD.id;
DELETE FROM blog_comments where blogid = OLD.id;
END
$$

Schritt 3 Trennzeichen wiederherstellen:

delimiter ;

Erläuterung:

OLD ist ein integriertes Schlüsselwort und bezieht sich auf die Blog-Tabellenzeile, die wir löschen. MySQL führt den Abzug aus blog_before_delete wann immer wir einen Eintrag in der Blog-Tabelle löschen. Wenn der Auslöser fehlschlägt, wird das Löschen zurückgesetzt. Dies hilft sicherzustellen Atomizität, Konsistenz, Isolation und Haltbarkeit in unserer datenbank.


3 für die Antwort № 2
CREATE TRIGGER `food_before_delete`
AFTER DELETE ON `food`
FOR EACH ROW
begin
DELETE FROM apple
WHERE apple.iduser=NEW.iduser;

DELETE FROM orange
WHERE orange.iduser=NEW.iduser;
end

Die Löschanweisungen erfordern möglicherweise OLD.iduser und unterstützen NEW.iduser nicht. Überprüfen Sie Ihr Handbuch.


1 für die Antwort № 3

Etwas einfacher vielleicht?

DELETE f,a,o FROM
food AS f
LEFT JOIN apple AS a USING (iduser)
LEFT JOIN orange AS o USING (iduser)
WHERE f.name = ...

Kein Auslöser erforderlich


1 für die Antwort № 4

Ich habe das vergessen BEGIN und END Blöcke im Abzug. Und Sie müssen sequenziell wie folgt aus Tabellen löschen:

CREATE TRIGGER `food_before_delete`
AFTER DELETE ON `food`
FOR EACH ROW
BEGIN
DELETE FROM apple
WHERE apple.iduser=NEW.iduser;

DELETE FROM orange
WHERE orange.iduser=NEW.iduser;
END

1 für die Antwort № 5

MySQL-Komplettlösung zum Erstellen eines Auslösers zum Löschen von zwei Tabellen mit einem Auslöser:

1. Login:

el@apollo:~$ mysql -u root -p
Enter password:
mysql> use your_database;
Database changed

2. Erstellen Sie einige Testtabellen und fügen Sie Zeilen ein:

mysql> create table derp(derp1 INT);
Query OK, 0 rows affected (0.02 sec)

mysql> create table foo(foo1 INT);
Query OK, 0 rows affected (0.02 sec)

mysql> create table bar(bar1 INT);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into derp values (1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into foo values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into bar values (1);
Query OK, 1 row affected (0.00 sec)

3. Machen Sie den Abzug:

mysql> delimiter //
mysql> create trigger delete_foo_and_bar_when_derp_is_deleted
-> after delete on derp
-> for each row
-> begin
-> delete from foo where foo1=OLD.derp1;
-> delete from bar where bar1=OLD.derp1;
-> end//
Query OK, 0 rows affected (0.02 sec)

4. Sehen Sie, ob die Tabellen vorhanden sind und alle drei ausgefüllt sind.

mysql> delimiter ;
mysql> select * from derp;
+-------+
| derp1 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

mysql> select * from foo;
+------+
| foo1 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from bar;
+------+
| bar1 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

5. Aus derp löschen

mysql> delete from derp where derp1 = 1;
Query OK, 1 row affected (0.01 sec)

6. Sehen Sie, dass derp, foo und bar jetzt leer sind:

mysql> select * from derp;
Empty set (0.00 sec)

mysql> select * from foo;
Empty set (0.00 sec)

mysql> select * from bar;
Empty set (0.00 sec)