mysql報錯ERROR 1093

賀子_DBA時代發表於2018-02-28
今天在嘗試用子查詢來關聯更新一個表的收到如下報錯:
ERROR 1093 (HY000): You can't specify target table 'v_member_info' for update in FROM clause
具體執行的sql如下:
MySQL [meminfo]> update v_member_info set cust_right_group=0 where id in (select id from v_member_info where pay_end_date<'2018-01-29' and cust_right_group>0);
ERROR 1093 (HY000): You can't specify target table 'v_member_info' for update in FROM clause
原來是mysql在update的時候, 原始表不能出現在where 後面第一層的子查詢中;
解決辦法:兩種改寫方法
1)改寫成join方式更新
MySQL [meminfo]> update v_member_info as a ,(select id,cust_right_group from v_member_info where pay_end_date<'2018-01-29' and cust_right_group>0) as b set a.cust_right_group=0 where a.id=b.id;
Query OK, 288 rows affected (2.35 sec)
Rows matched: 288 Changed: 288 Warnings: 0
2)或者改成子查詢之子查詢
MySQL [meminfo]> update v_member_info set cust_right_group=0 where id in(select id from (select id from v_member_info where pay_end_date<'2018-01-29' and cust_right_group>0)a);
小結:Oracle和MySQL還是有區別的,MySQL在update的時候,原始表不能出現在where 後面第一層的子查詢當中,至於兩種改寫的效能的看具體業務和資料量的大小。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2151383/,如需轉載,請註明出處,否則將追究法律責任。

相關文章