PostgreSQL执行两张表关联删除SQL时出现INNER附近语法错误
报错原因
你使用的带INNER JOIN的DELETE语法是MySQL的特有实现,PostgreSQL不支持该写法,因此会触发语法校验错误。
修复方案
根据你的删除需求可以选择对应实现:
场景1:仅删除TABLE1中满足关联条件的记录
可以用PostgreSQL原生支持的USING子句实现关联过滤,写法如下:
DELETE FROM TABLE1 USING TABLE2 WHERE TABLE1.id = TABLE2.id AND TABLE1.id = '21306';
也可以用通用的EXISTS子查询实现,兼容性更强:
DELETE FROM TABLE1 WHERE id = '21306' AND EXISTS (SELECT 1 FROM TABLE2 WHERE TABLE2.id = TABLE1.id);
场景2:需要同时删除两张表中对应ID的记录
因为两张表存在主外键关联,默认需要先删除从表数据再删除主表数据,或者开启外键级联删除属性:
- 方法1:分两次显式删除(推荐,逻辑可控)
-- 先删除从表记录,注意将TABLE2替换为实际的从表名 DELETE FROM TABLE2 WHERE id = '21306'; -- 再删除主表记录 DELETE FROM TABLE1 WHERE id = '21306';
- 方法2:开启外键级联删除,单次操作自动关联删除
首先修改表结构给外键添加级联删除属性(仅需执行一次):
ALTER TABLE TABLE2 ADD CONSTRAINT fk_table2_table1_id FOREIGN KEY (id) REFERENCES TABLE1(id) ON DELETE CASCADE;
后续直接删除主表数据即可自动触发从表关联数据删除:
DELETE FROM TABLE1 WHERE id = '21306';
内容的提问来源于stack exchange,提问作者Dungeon wolf
相关产品推荐
相关产品推荐

