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;
通常我想 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;