Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在一个查询中从两个表中删除_Sql_Mysql - Fatal编程技术网

Sql 在一个查询中从两个表中删除

Sql 在一个查询中从两个表中删除,sql,mysql,Sql,Mysql,我在MySQL中有两个表 #messages table : messageid messagetitle . . #usersmessages table usersmessageid messageid userid . . 现在,如果我想从messages表中删除,就可以了。但当我按messageid删除消息时,usersmessage上仍然存在记录,我必须立即从这两个表中删除 我使用了以下查询: DELETE FROM messages LEFT JOIN usersmes

我在MySQL中有两个表

#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);