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` 子查詢中。
UPDATE apples
SET price = (
SELECT price FROM (
SELECT * FROM apples
) AS x
WHERE variety = 'gala'
)
WHERE variety = 'fuji';
原理:內層 `SELECT * FROM apples` 產生**臨時表 (衍生表)**,外層查詢臨時表,**不再直接引用目標表**,繞過限制。
| 場景 | 問題 | 建議 |
|---|---|---|
| `IN (SELECT ...)` 子查詢優化器重寫為相關子查詢 | 衍生表包裹無法阻止重寫 | 改寫為 `JOIN` |
| 同一臨時表需多次引用 | 編譯期建立,非執行期 | 使用 `CTE` (MySQL 8.0+) 或臨時表 |