2

通常,我想从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表中的所有行,这是我绝对不想要的。

我正在寻求帮助修改第一个或第二个解决方案以进行适当的工作。

4

2 回答 2

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' );
于 2015-07-01T21:35:06.493 回答
2

如果id可以在 中重复order,则可以使用 a 表示查询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;
于 2015-07-02T02:15:54.953 回答