MySQL 与 PostgreSQL 的删除查询区别

Delete Query difference between MySQL and PostgreSQL

我正在从 MySQL 切换到 PostgreSQL,这个在 mysql 上的删除查询在 postgresql 中显示错误:

DELETE c FROM customers_vs_coupons c JOIN coupons d ON c.coupon_id=d.id WHERE d.company_id = ?1



ERROR:  syntax error at or near "c"
LINE 1: DELETE c FROM customers_vs_coupons c JOIN coupons d ON c.cou...
               ^
SQL state: 42601
Character: 8

我可以通过将查询更改为

来让它工作
DELETE FROM customers_vs_coupons USING customers_vs_coupons AS c JOIN coupons AS d ON c.coupon_id=d.id WHERE d.company_id = 1;

但想知道为什么会抛出错误?

因为SQL语法不符合SQL标准:

第 14 章第 7 节说:

14.7 <delete statement: searched>

Function

Delete rows of a table.

Format

<delete statement: searched> ::=
    DELETE FROM <target table> [ [ AS ] <correlation name> ]
    [ WHERE <search condition> ]

它抛出一个错误,因为 MySQL 和 PostgreSQL 不是一回事。两种产品都没有承诺反省对方的所有非标准行为(也没有承诺实施所有标准)。

请注意,您的“有效”查询是错误的。它将删除所有行,因为您进行了 3 向连接,并且要删除的 table 和其他两个 table 之间没有限制。

正确的 PostgreSQL 语法是:

DELETE FROM customers_vs_coupons c USING coupons AS d where c.coupon_id=d.id and d.company_id = 1;

或者此语法适用于两个数据库:

DELETE FROM customers_vs_coupons c where exists (select 1 from coupons AS d where c.coupon_id=d.id and d.company_id = 1);