UPDATE test.tb_vobile a SET a.name = '111' WHERE a.id = (SELECT MAX(id) FROM test.tb_vobile); -- Error 1093: You can't specify target table 'a' for update in FROM clause
MySQL 限制:**更新目標表不能同時出現在子查詢的 FROM 子句中**(含衍生表)。這是為了避免語義模糊與死鎖風險。
UPDATE test.tb_vobile a JOIN (SELECT MAX(id) AS id FROM test.tb_vobile) b ON a.id = b.id SET a.name = '123';
UPDATE test.tb_vobile a,
(SELECT MAX(id) AS id FROM test.tb_vobile) b
SET a.name = '321'
WHERE a.id = b.id;
| 特性 | 說明 |
|---|---|
| 目標表可在 UPDATE 後列出多個 | UPDATE a, b SET a.x=b.y, b.z=a.w WHERE ... |
| UPDATE 後跟 JOIN/衍生表 | 相當於 FROM 子句,可繞過 1093 限制 |
| DELETE 同理 | DELETE a FROM a JOIN b ON ... WHERE ... |
| SET 子句可引用任意表列 | 跨表賦值自動完成 |
-- 用 B 表 age 更新 A 表 UPDATE a JOIN b ON a.id = b.id SET a.age = b.age; -- 用 B 表條件刪除 A 表數據 DELETE a FROM a JOIN b ON a.id = b.id WHERE b.name = 'pw';
WITH (CTE, 8.0+) 先定義衍生表再 JOIN-- 更新前驗證將影響哪些行 SELECT a.*, b.id AS match_id FROM tb_vobile a JOIN (SELECT MAX(id) AS id FROM tb_vobile) b ON a.id = b.id;