[英]Delete from two tables in one query
我在 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'
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表的那一行。
您应该使用ON DELETE CASCADE
创建一个FOREIGN KEY
:
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
表。
不需要连接:
DELETE m, um FROM messages m, usersmessages um
WHERE m.messageid = 1
AND m.messageid = um.messageid
您有两个选择:
首先,在一个事务中做两条语句:
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 的更多信息。
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
作为示例列。
很高兴这有帮助。 :)
您也可以这样使用,当两列具有 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();
}
然后您可以将用户重定向到主页。
header('LOCATION:' . $home_page);
希望这会帮助某人:)
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.