【问题标题】:Why is my SQL OUTPUT statement not working?为什么我的 SQL OUTPUT 语句不起作用?
【发布时间】:2021-03-28 20:52:34
【问题描述】:

执行以下 2 个查询时:

INSERT INTO Orders (CustomerID) 
OUTPUT INSERTED.OrderID 
VALUES ('1');

INSERT INTO Orders (CustomerID) 
OUTPUT INSERTED.* 
VALUES ('1');

我得到以下异常:

org.postgresql.util.PSQLException: ERROR: "OUTPUT" 处或附近的语法错误

Orders 表是使用以下工具创建的:

CREATE TABLE Orders 
(
     OrderID SERIAL PRIMARY KEY, 
     CustomerID int NOT NULL, 

     FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

我做错了什么?谢谢

【问题讨论】:

  • Postgres 有OUTPUT 吗?我以为它使用了RETURNING
  • 请注意'1' 是一个字符串,而不是一个整数值。跳过引用,如果 ID 列数据类型是整数,只需执行 VALUES (1);

标签: sql postgresql sql-insert


【解决方案1】:

SQL Server 中 output 的等价物是 PostgreSQL 中的 returning。请试试这个。

INSERT INTO Orders (CustomerID)  
values('1')
returning CustomerID;

你也可以使用*

INSERT INTO Orders (CustomerID)  
    values('1')
    returning *;

【讨论】:

    【解决方案2】:

    output 子句不是standard SQL 的一部分。这是一个SQL Server extension

    PostgreSQL equivalent 也是非标准的returning

    可选的 RETURNING 子句使 INSERT 根据实际插入的每一行计算并返回值(或更新,如果使用了 ON CONFLICT DO UPDATE 子句)。这主要用于获取默认提供的值,例如序列号。但是,任何使用表列的表达式都是允许的。 RETURNING 列表的语法与 SELECT 的输出列表的语法相同。只会返回成功插入或更新的行。例如,如果由于不满足 ON CONFLICT DO UPDATE ... WHERE 子句条件而锁定但未更新行,则不会返回该行。

    没有虚拟的inserted 表,它位于插入的末尾。

    test=> create table foo ( id bigserial primary key, name text );
    CREATE TABLE
    
    test=> INSERT INTO foo (name) VALUES ('test') returning *;
     id | name 
    ----+------
      1 | test
    

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多