У меня две таблицы в MySQL
#messages table :
messageid
messagetitle
.
.
#usersmessages table
usersmessageid
messageid
userid
.
.
Теперь, если я хочу удалить из таблицы сообщений, ничего страшного. Но когда я удаляю сообщение по идентификатору сообщения, запись по-прежнему существует в пользовательском сообщении, и мне нужно удалить сразу две эти таблицы.
Я использовал следующий запрос:
DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ;
Затем я тестирую
DELETE FROM messages , usersmessages
WHERE messages.messageid = usersmessages.messageid
and messageid='1' ;
Но эти два запроса не решают эту задачу.
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 .
источник
Вы должны либо создать с
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
таблицы.источник
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 );
Вы можете узнать больше о КАСКАДЕ УДАЛЕНИЯ здесь .
источник
нет необходимости в JOINS:
DELETE m, um FROM messages m, usersmessages um WHERE m.messageid = 1 AND m.messageid = um.messageid
источник
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
источник
В OP просто отсутствуют псевдонимы таблиц после удаления
DELETE t1, t2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t1.id = some_id
источник
Попробуйте это пожалуйста
DELETE FROM messages,usersmessages USING messages INNER JOIN usermessages on (messages.messageid = usersmessages.messageid) WHERE messages.messsageid='1'
источник
Попробуй это..
DELETE a.*, b.* FROM table1 as a, table2 as b WHERE a.id=[Your value here] and b.id=[Your value here]
Приведу
id
как образец колонки.Рад, что это помогает. :)
источник
*
) отображались правильно, вам нужно сделать отступ запроса 4 пробелами перед ним.Вы также можете использовать это для удаления определенного значения, когда оба столбца имеют 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';
источник
есть другой способ, который здесь не упоминается (я еще не полностью тестировал его производительность), вы можете установить массив для всех таблиц -> строки, которые вы хотите удалить, как показано ниже
// set your tables array $array = ['table1', 'table2', 'table3']; // loop through each table for($i = 0; $i < count($array); $i++){ // get each single array $single_array = $array[$i]; // build your query $query = "DELETE FROM $single_array WHERE id = 'id'"; // prepare the query and get the connection $data = con::GetCon()->prepare($query); // execute the action $data->execute(); }
тогда вы можете перенаправить пользователя на домашнюю страницу.
надеюсь, это кому-то поможет :)
благодаря
источник