<code>場景示範:</code>
<code>mysql> </code><code>create</code> <code>table</code> <code>test(id </code><code>int</code><code>,</code><code>name</code> <code>varchar</code><code>(12),</code><code>primary</code> <code>key</code><code>(id));</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.04 sec)</code>
<code>mysql> </code><code>insert</code> <code>into</code> <code>test </code><code>values</code><code>(1,</code><code>'ttt'</code><code>);</code>
<code>Query OK, 1 row affected (0.00 sec)</code>
<code>mysql> </code><code>insert</code> <code>into</code> <code>test </code><code>values</code><code>(2,</code><code>'ttt'</code><code>);</code>
<code>mysql> </code><code>commit</code><code>;</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.00 sec)</code>
<code>mysql> </code><code>update</code> <code>test </code><code>set</code> <code>name</code><code>=</code><code>'aaaa'</code> <code>where</code> <code>id </code><code>in</code> <code>(</code><code>select</code> <code>id </code><code>from</code> <code>test);</code>
<code>ERROR 1093 (HY000): You can</code><code>'t specify target table '</code><code>test' </code><code>for</code> <code>update</code> <code>in</code> <code>FROM</code> <code>clause</code>
官方說明:
Error: 1093 SQLSTATE: HY000 (ER_UPDATE_TABLE_USED)
Message: You can't specify target table '%s' for update in FROM clause
This error occurs for attempts to select from and modify the same table within a single statement. If the select attempt occurs within a derived table, you can avoid this error by setting the derived_merge flag of the optimizer_switch system variable to force the subquery to be materialized into a temporary table, which effectively causes it to be a different table from the one modified. See Section 9.2.2.3, “Optimizing Derived Tables and View References”.
mysql不支援,在一條語句對同一個表,先查詢再更新的操作。
解決方法1:改成sql
比如:利用臨時表
<code>mysql> </code><code>update</code> <code>test </code><code>set</code> <code>name</code><code>=</code><code>'aaaa'</code> <code>where</code> <code>id </code><code>in</code> <code>(</code><code>select</code> <code>id </code><code>from</code> <code>(</code><code>select</code> <code>id </code><code>from</code> <code>test)c);</code>
<code>Query OK, 2 </code><code>rows</code> <code>affected (0.02 sec)</code>
<code>Rows</code> <code>matched: 2 Changed: 2 Warnings: 0</code>
解決方法2:
官方說:可以通過設定optimizer_switch的 derived_merge參數來解決。
備注:Oracle是不會這個問題的
本文轉自 corasql 51CTO部落格,原文連結:http://blog.51cto.com/corasql/1912236,如需轉載請自行聯系原作者