訂單表有個字段倉庫id,揀貨單之前沒有倉庫id。由於業務的需求,需要揀貨單增加倉庫字段。
訂單表和揀貨單的關係表:wms_relation。
爲了修復老數據,需要一個腳本訂正,把訂單表的倉庫 更新到揀貨單倉庫字段。
想想很簡單吧。。
寫了一個sql語句:
update picking_main p
set p.warehouse_id=(select som.warehouse_id
from picking_main pm
left join wms_relation wr on wr.two_id = pm.id
right join send_order_main som on wr.one_id=som.id
where pm.id=p.id);
結果一執行,報錯:
> 1093 - You can't specify target table 'p' for update in FROM clause
從網上找到原因:
mysql不允許update目標表和子查詢裏面的表爲同一張表
解決辦法: 利用子查詢sql可以改變雙層的子查詢,即可執行成功 (但性能較差,僅僅適合較小的數據量的)。
於是改成下面的sql:
update picking_main p
set p.gmt_modified=now(),
p.warehouse_id = (select temp.warehouse_id from (select som.warehouse_id ,pm.id
from picking_main pm
left join wms_relation wr on wr.two_id = pm.id
right join send_order_main som on wr.one_id=som.id
) as temp where temp.id=p.id)
成功!
對於我這個場景,還有一種更簡單方法,不需要連接picking_main (其他同事想到了,自己沒有想起來。。。)
start TRANSACTION;
update picking_main pm set pm.warehouse_id = (
select som.warehouse_id from send_order_main som
INNER JOIN wms_relation wr on wr.one_id = som.id
where wr.two_id and wr.type = 1
limit 1
);
ROLLBACK;
select count(1) from picking_main ;
wms_relation保存了兩種對象的關係(1對1,多對1,多對多等),type=1時,保留的就是訂單和揀貨單出庫單的關係了,所以子查詢無需再去關聯揀貨單表,這樣就不會出現update目標表和子查詢裏面的表爲同一張表。