2

通常orders、ある日付の後に作成されたデータベースのテーブルから行を選択office_idし、選択したすべての行のフィールドを特定の値に更新します12。私の MySQL バージョンは 5.5.43 です。最初は、次のように1つの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ますが、これは絶対に望ましくありません。

適切な作業のための第 1 または第 2 の解決策を修正するためのヘルプを探しています。

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、次を使用してクエリを表現できます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 に答える