У меня есть две таблицы в MySQL
#messages table :
messageid
messagetitle
.
.
#usersmessages table
usersmessageid
messageid
userid
.
.
Теперь, если я хочу удалить из таблицы сообщений, она в порядке. Но когда я удаляю сообщение messageid, запись все еще существует на usersmessage, и я должен удалить из этого две таблицы сразу.
Я использовал следующий запрос:
DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ;
Затем я тестирую
DELETE FROM messages , usersmessages
WHERE messages.messageid = usersmessages.messageid
and messageid='1' ;
Но эти два запроса не выполняют эту задачу.
Разве вы не можете просто разделить их точкой с запятой?
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'
Вы должны либо создать 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
.
У вас есть два варианта:
Во-первых, выполните два оператора внутри транзакции:
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 можно прочитать здесь .