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);
我正在从 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);