繁体   English   中英

MySQL从同一个表中选择并更新多行

[英]MySQL select and update multiple rows from same table

通常我想从我的数据库中的orders表中选择行,这些行是在某个日期之后创建的,然后将所有选定行的office_id字段更新为特定值12 我的MySQL版本是5.5.43。 在第一次,我试图把它放在一个SQL语句中,如下所示:

UPDATE `order`
SET office_id = 12
WHERE id IN (  
  SELECT id
  FROM  `order` 
  WHERE created_at >= DATE_FORMAT( '2014-07-02 00:00:00', '%Y.%m.%d 00:00:00' ) 
);

我收到错误: #1093 - You can't specify target table 'order' for update in FROM clause

接下来我尝试使用SELECT .. FOR UPDATE语句这样做:

START TRANSACTION;

SELECT id
FROM  `order` 
WHERE created_at >= DATE_FORMAT( '2014-07-02 00:00:00', '%Y.%m.%d 00:00:00' ) 
FOR UPDATE;

UPDATE `order`
SET office_id = 12
WHERE id IN ( id );

COMMIT;

哪个工作,但如果SELECT .. FOR UPDATE语句没有返回任何行,那么office_id = 12将应用于orders表中的所有行,这是我绝对不想要的。

我正在寻找帮助修改第一或第二个适合工作的解决方案。

它比你制作它简单得多。 您可以将WHERE子句直接应用于UPDATE语句。

UPDATE `order`
    SET office_id = 12
    WHERE created_at >= DATE_FORMAT( '2014-07-02 00:00:00', '%Y.%m.%d 00:00:00' );

如果id可以按order复制,那么您可以使用join表达查询:

UPDATE `order` o JOIN
       (SELECT distinct o.id
        FROM  `order` o
        WHERE created_at >= DATE_FORMAT( '2014-07-02 00:00:00', '%Y.%m.%d 00:00:00' 
       ) oo
       ON o.id = oo.id
    SET o.office_id = 12;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM