удалить из двух таблиц в одном запросе - PullRequest
62 голосов
/ 05 августа 2009

у меня есть две таблицы в MySQL

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

Теперь я хочу удалить из таблицы сообщений, все в порядке. но когда я удаляю сообщение с messageid = '1', например, оно все еще существует в сообщении пользователя, я должен удалить из этих двух таблиц одновременно;

, поэтому я использую следующий запрос:

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

тогда я проверяю

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

но эти два запроса не решают эту задачу.

Ответы [ 10 ]

110 голосов
/ 05 августа 2009

Разве вы не можете просто разделить их точкой с запятой?

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

OR

Просто используйте INNER JOIN, как показано ниже

DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'
39 голосов
/ 26 февраля 2011
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

перевод: удалить из таблицы сообщения , где messageid = 1, если таблица uersmessages имеет messageid = messageid таблицы сообщений , удалить эту строку uersmessages таблица.

11 голосов
/ 05 августа 2009

Вы должны либо создать FOREIGN KEY с ON DELETE CASCADE:

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

, или сделайте это, используя два запроса в транзакции:

START TRANSACTION;;

DELETE
FROM    usermessages
WHERE   messageid = 1

DELETE
FROM    messages
WHERE   messageid = 1;

COMMIT;

Транзакция затрагивает только InnoDB таблиц.

7 голосов
/ 05 августа 2009

У вас есть два варианта:

Сначала сделайте два оператора внутри транзакции:

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

Или вы можете настроить ON DELETE CASCADE с помощью внешнего ключа. Это лучший подход.

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
);

Подробнее об ON DELETE CASCADE можно прочитать здесь .

6 голосов
/ 05 ноября 2013
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
4 голосов
/ 10 сентября 2016

нет необходимости в JOINS:

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
1 голос
/ 03 июля 2013

Попробуйте, пожалуйста

DELETE FROM messages,usersmessages

USING messages

INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)

WHERE messages.messsageid='1'
0 голосов
/ 28 сентября 2018

УДАЛИТЬ t1, t2 ОТ table1 t1 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ table2 t2 ВКЛ t1. id = t2. id ГДЕ t1.id = some_id

0 голосов
/ 09 марта 2018

Вы также можете использовать это, чтобы удалить определенное значение, когда оба столбца имеют 2 или много одинаковых имен столбцов.

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';
0 голосов
/ 01 октября 2017

Попробуйте это ..

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

В качестве примера столбца я указываю id.

Рад, что это помогает. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...