MySQL select 并从相同的 table 更新多行

MySQL select and update multiple rows from same table

通常我想 select 我数据库中 orders table 的行,这些行是在某个日期之后创建的,然后更新所有 office_id 字段 selected 行到特定值 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 声明 returns 没有行,那么 office_id = 12 将应用于 orders table 中的所有行,我绝对不想。

我正在寻求有关修改第 1 或第 2 解决方案以确保正常工作的帮助。

它比你做的要简单得多。您可以将 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;