首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UPDATE 同表子查詢報錯 1093 解決方案:衍生表包裹法

     編輯:MySQL 資料庫相關知識

問題

UPDATE apples
SET price = (SELECT price FROM apples WHERE variety = 'gala')
WHERE variety = 'fuji';
-- ERROR 1093 (HY000): You can't specify target table 'apples' for update in FROM clause

MySQL 禁止 `UPDATE` 目標表同時出現在 `FROM` 子查詢中。

解決:套一層衍生表 (Derived Table)

UPDATE apples
SET price = (
    SELECT price FROM (
        SELECT * FROM apples
    ) AS x
    WHERE variety = 'gala'
)
WHERE variety = 'fuji';

原理:內層 `SELECT * FROM apples` 產生**臨時表 (衍生表)**,外層查詢臨時表,**不再直接引用目標表**,繞過限制。

適用場景

  • 同表統計值回寫 (如 `UPDATE t SET cnt = (SELECT COUNT(*) FROM t ...)`)
  • 同表欄位互相賦值
  • 需 `GROUP BY` 聚合後更新

不適用 / 需改寫的場景

MySQL 8.0+ 更優雅:CTE

WITH gala_price AS (
    SELECT price FROM apples WHERE variety = 'gala'
)
UPDATE apples
SET price = (SELECT price FROM gala_price)
WHERE variety = 'fuji';

結語

**「套層衍生表」是 MySQL 5.x 解決 UPDATE 同表子查詢 1093 錯誤的標準手法**。MySQL 8.0 建議改用 CTE,語意更清晰、優化器處理更好。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景問題建議
`IN (SELECT ...)` 子查詢優化器重寫為相關子查詢衍生表包裹無法阻止重寫改寫為 `JOIN`
同一臨時表需多次引用編譯期建立,非執行期使用 `CTE` (MySQL 8.0+) 或臨時表