удалить из двух таблиц в одном запросе

42

У меня есть две таблицы в mysql

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

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

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

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

тогда я тестирую

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

но эти два запроса не справляются с этой задачей.

Теги:

8 ответов

85
Лучший ответ

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

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

ИЛИ

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

DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'
  • 1
    что произойдет, если я захочу поместить этот код в цикл? я знаю, что могу поставить точку с запятой абсолютно.
  • 12
    @mehdi: Mehdi: ИТ будет выполнять удаление снова и снова в цикле ...
Показать ещё 12 комментариев
33
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

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

  • 0
    Комментарий для всех: как показано в этом примере, важно указать, в какой таблице должно выполняться удаление. Отличный пост @angry_kiwi
  • 0
    Мне просто нужно было изменить порядок, ИЗ сообщений пользователей b СЛЕВАЯ ПРИСОЕДИНЕНИЕ к сообщениям a
10

Вы должны либо создать 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.

  • 2
    Вы можете удалить из нескольких таблиц в одном запросе! dev.mysql.com/doc/refman/5.0/en/delete.html
  • 0
    Да, ты можешь! Но мне ... легче сделать то, что сказал мой ответ.
Показать ещё 5 комментариев
7

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

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

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 здесь.

  • 0
    Благодарю. +1 повышение за НАЧАТЬ BEGIN; .... COMMIT;
5
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
3

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

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 
1

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

DELETE FROM messages,usersmessages

USING messages

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

WHERE messages.messsageid='1'
0

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

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

Я даю id как образец столбца.

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

  • 0
    Чтобы звёздочки ( * ) отображались правильно, вам нужно сделать отступ с 4 пробелами перед ним.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню