嘗試在同一張表上用子查詢結果進行更新:
UPDATE wms_cabinet_form SET cabf_enabled=0
WHERE cabf_id IN (
SELECT wms_cabinet_form.cabf_id FROM wms_cabinet_form
INNER JOIN wms_cabinet ON ...
WHERE ...
);
報錯:You can't specify target table 'wms_cabinet_form' for update in FROM clause
MySQL 限制:單條 SQL 中不能先 SELECT 同一表資料再 UPDATE 該表(衍生表鎖定機制)。
將子查詢包裝一層衍生表(Derived Table),使 MySQL 認為是不同表:
UPDATE wms_cabinet_form SET cabf_enabled=0
WHERE cabf_id IN (
SELECT a.cabf_id FROM (
SELECT tmp.* FROM wms_cabinet_form tmp
) a
INNER JOIN wms_cabinet b ON a.cabf_cab_id = b.cab_id
INNER JOIN wms_cabinet_row c ON b.cab_row_id = c.row_id
WHERE c.row_site_id=29 AND a.cabf_enabled=1
);
SELECT tmp.* FROM wms_cabinet_form tmp 建立臨時結果集。SELECT a.cabf_id FROM (...) a 讓優化器視為獨立衍生表。UPDATE ... JOIN 語法(MySQL 支援)。IN (...) 執行更新。