通常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 の解決策を修正するためのヘルプを探しています。