sql 查詢表內不重復記錄的神秘包裹
在執行 SQL 查詢語句時,你可能會遇到這樣的錯誤:”SQL 錯誤 [1093] [HY000]: You can’t specify target table ‘sys_post’ for update in FROM clause”。這通常是因為你試圖在一個子查詢的 from 子句中更新當前正在查詢的表。
然而,如果在子查詢周圍添加一層包裹,即使用一個派生表并通過別名引用該表,查詢就能成功執行。
mysql 的特殊性
這種行為是 MySQL 特有的。其他大型數據庫管理系統,如 oracle 和 SQL Server,沒有這樣的限制。
官方解釋
MySQL 官方唯一對這一行為的解釋是:”You cannot update a table and select directly from the same table in a subquery.”(你不能更新一個表并在一個子查詢中直接從同一張表中選擇。)
解決方案
官方提供的解決方案是使用多表更新,其中一個表派生自你實際上希望更新的表,并使用別名引用派生表。
原因猜測
至于為什么 MySQL 有這樣奇怪的限制,原因不得而知??赡苁菫榱朔乐挂恍┮馔獾母禄驔_突,但具體的解釋官方并沒有給出。