【问题标题】:Delete Query difference between MySQL and PostgreSQL删除 MySQL 和 PostgreSQL 的查询区别
【发布时间】:2020-07-17 13:33:33
【问题描述】:

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

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

【问题讨论】:

    标签: mysql postgresql syntax sql-delete


    【解决方案1】:

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

    请注意,您的“工作”查询是错误的。它将删除所有行,因为您执行的是 3 路连接,并且正在删除的表与其他两个表之间没有限制。

    正确的 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);
    

    【讨论】:

      【解决方案2】:

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

      第 14 章第 7 节说:

      14.7

      功能

      删除表格的行。

      格式

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

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        相关资源
        最近更新 更多