DELETE 搭 JOIN 的寫法 MySQL 與 PostgreSQL 不相容
「刪除時參照另一張表」是兩邊都支援的能力,但語法完全不同——MySQL 在
DELETE後指定要刪哪個別名,PostgreSQL 用USING引入對照表。抄錯邊會直接 syntax error,不是跑出錯結果。
MySQL
DELETE 和 FROM 中間放別名,表示「這張 join 出來的結果裡,刪掉哪一側」:
DELETE p1
FROM Person p1
JOIN Person p2
ON p1.email = p2.email AND p1.id > p2.id;多表 join 時可以寫 DELETE p1, p2 FROM ... 一次刪兩張。
PostgreSQL
DELETE FROM 後面只能接一張要被刪的表,對照表一律走 USING,連接條件全部寫進 WHERE:
DELETE FROM Person p1
USING Person p2
WHERE p1.email = p2.email
AND p1.id > p2.id;USING 等同於 FROM 的第二張表,沒有 ON 這個位置可寫。
為什麼要記這條
- 兩邊都合法、語意相同,但沒有一種寫法兩邊都跑得動——要可攜就退回
WHERE id IN (子查詢)或EXISTS。 - 換 DB 或在教學/LeetCode 上抄到的答案,第一個要確認的就是方言,別先懷疑自己的去重邏輯(例:196 Delete Duplicate Emails)。