mysql錯誤:1093-You can’t specify target table for update in FROM clause的解決方法

訂單表有個字段倉庫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目標表和子查詢裏面的表爲同一張表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章