天天看點

mysql Error1093錯誤

<code>場景示範:</code>

<code>mysql&gt; </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&gt; </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&gt; </code><code>insert</code> <code>into</code> <code>test </code><code>values</code><code>(2,</code><code>'ttt'</code><code>);</code>

<code>mysql&gt; </code><code>commit</code><code>;</code>

<code>Query OK, 0 </code><code>rows</code> <code>affected (0.00 sec)</code>

<code>mysql&gt;  </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&gt;  </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,如需轉載請自行聯系原作者