Sql 在一个查询中从两个表中删除
我在MySQL中有两个表Sql 在一个查询中从两个表中删除,sql,mysql,Sql,Mysql,我在MySQL中有两个表 #messages table : messageid messagetitle . . #usersmessages table usersmessageid messageid userid . . 现在,如果我想从messages表中删除,就可以了。但当我按messageid删除消息时,usersmessage上仍然存在记录,我必须立即从这两个表中删除 我使用了以下查询: DELETE FROM messages LEFT JOIN usersmes
#messages table :
messageid
messagetitle
.
.
#usersmessages table
usersmessageid
messageid
userid
.
.
现在,如果我想从messages表中删除,就可以了。但当我按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'
或
只需使用内部连接
,如下所示
DELETE messages , usersmessages FROM messages INNER JOIN usersmessages
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'
您应该创建一个
外键
,在删除级联时使用:
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;
BEGIN;
DELETE FROM messages WHERE messageid = 1;
DELETE FROM usermessages WHERE messageid = 1;
COMMIT;
不过,事务只影响InnoDB表。您有两个选项:
首先,在事务中执行两条语句:
START TRANSACTION;;
DELETE
FROM usermessages
WHERE messageid = 1
DELETE
FROM messages
WHERE messageid = 1;
COMMIT;
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
);
您可以阅读有关删除级联的更多信息
翻译:从表消息中删除,其中messageid=1,如果表uersmessages具有表消息的messageid=messageid,则删除该行uersmessages表 请试试这个
DELETE FROM messages,usersmessages
USING messages
INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)
WHERE messages.messsageid='1'
无需连接:
DELETE m, um FROM messages m, usersmessages um
WHERE m.messageid = 1
AND m.messageid = um.messageid
试试这个
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';
OP只是缺少删除后的表别名
DELETE t1, t2
FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t1.id = some_id
这里没有提到另一种方法(我还没有完全测试它的性能),您可以为所有要删除的表->行设置数组,如下所示
// 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();
}
希望这对某人有所帮助:)
谢谢您可以在一次查询中从多个表中删除!是的,你可以!但对我来说…我的回答更容易做到。我在我的一张类似的表格上添加了瀑布。当我试图仅从1个表中删除时,它删除了该记录,并使相关的记录成为孤立记录。约束有什么用?@barfoon:你的表是不是InnoDB
?@Quassnoi-Oops!我肯定认为这是,多么愚蠢。所有的桌子都是MyISAM。我可以用数据动态更改所有这些文件吗?或者这有问题吗?如果我想把这个代码放在一个循环中会发生什么?我知道我完全可以把分号放进去。它可以放在一个循环中。您可以通过编程方式执行此操作,并将消息id作为参数发送。只要你不继续发送相同的id,它就不会一次又一次地删除。如果你在两个查询中都这样做,你真的应该把它包装在一个事务中。至于在循环中运行删除查询,最好是制定一个查询来执行所有删除操作。签出另一个使用联接的删除查询示例不适用于SQL Server:“,”附近的语法不正确。全部注释:如本示例所示,指定删除操作应在哪个表中进行非常重要。Great post@angry\u kiwiI刚刚更改了顺序,从用户消息b左加入消息到星号(*
)正确呈现,您需要在查询前面缩进4个空格。谢谢您的回答。如果你试着解释为什么这会起作用,为什么OPs解决方案不起作用,那会更有帮助。。。虽然看起来像PHP,但我认为这不一定在问题的范围之内:),但这仍然是一个隐式的交叉连接
header('LOCATION:' . $home_page);