Löschen Sie aus zwei Tabellen in einer Abfrage

Ich habe zwei Tabellen in MySQL

#messages table : messageid messagetitle . . #usersmessages table usersmessageid messageid userid . . 

Jetzt möchte ich aus der Nachrichtentabelle löschen, es ist in Ordnung. aber wenn ich eine Nachricht mit messageid = ‘1’ lösche, zum Beispiel ist es immer noch vorhanden auf usersmessage, die ich aus diesen beiden Tabellen auf einmal löschen muss;

also benutze ich die folgende Abfrage:

 DELTE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ; 

dann teste ich

  DELETE FROM messages , usersmessages WHERE messages.messageid = usersmessages.messageid and messageid='1' ; 

aber diese zwei Abfragen sind dieser Aufgabe nicht gewachsen.

   

Kannst du sie nicht einfach durch ein Semikolon trennen?

 Delete from messages where messageid = '1'; Delete from usersmessages where messageid = '1' 

ODER

Verwenden INNER JOIN einfach INNER JOIN wie unten

 DELETE messages , usersmessages FROM messages INNER JOIN usersmessages WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1' 
 DELETE a.*, b.* FROM messages a LEFT JOIN usersmessages b ON b.messageid = a.messageid WHERE a.messageid = 1 

Übersetzung: aus der Tabelle löschen Nachrichten wo MessageID = 1, wenn Tabelle uersmessages MessageID = MessageId der Tabelle Nachrichten , löschen Sie diese Zeile der Tabelle uersmessages .

Sie sollten entweder einen FOREIGN KEY mit ON DELETE CASCADE erstellen:

 ALTER TABLE usersmessages ADD CONSTRAINT fk_usermessages_messageid FOREIGN KEY (messageid) REFERENCES messages (messageid) ON DELETE CASCADE 

oder verwenden Sie zwei Abfragen in einer Transaktion:

 START TRANSACTION;; DELETE FROM usermessages WHERE messageid = 1 DELETE FROM messages WHERE messageid = 1; COMMIT; 

Die Transaktion betrifft jedoch nur InnoDB Tabellen.

Sie haben zwei Möglichkeiten:

Führen Sie zuerst zwei statementen in einer Transaktion aus:

 BEGIN; DELETE FROM messages WHERE messageid = 1; DELETE FROM usermessages WHERE messageid = 1; COMMIT; 

Oder Sie könnten ON DELETE CASCADE mit einem Fremdschlüssel einrichten lassen. Dies ist der bessere Ansatz.

 CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE child ( id INT, parent_id INT, FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ); 

Sie können hier mehr über ON DELETE CASCADE lesen.

 DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1' 

keine Notwendigkeit für JOINS:

 DELETE m, um FROM messages m, usersmessages um WHERE m.messageid = 1 AND m.messageid = um.messageid 

Versuchen Sie es bitte

 DELETE FROM messages,usersmessages USING messages INNER JOIN usermessages on (messages.messageid = usersmessages.messageid) WHERE messages.messsageid='1' 

Versuche dies..

 DELETE a.*, b.* FROM table1 as a, table2 as b WHERE a.id=[Your value here] and b.id=[Your value here] 

Ich lasse id als Beispielspalte.

Gut, das hilft. 🙂

Sie können auch so verwenden, um einen bestimmten Wert zu löschen, wenn beide Spalten 2 oder mehrere Spaltennamen enthalten.

 DELETE project , create_test FROM project INNER JOIN create_test WHERE project.project_name='Trail' and create_test.project_name ='Trail' and project.uid= create_test.uid = '1';