Postgres中带有DO UPDATE的FROM子句

时间:2020-05-20 06:43:36

标签: postgresql

我正在使用CONFLICT编写向上查询。但是我在更新部分面临问题。这是我的查询样子。

INSERT INTO
   customers (name, email, city) 
   SELECT
      'jack',
      'jack@io' as email,
      city 
   FROM
      customers 
   where
      id = 1 
      ON CONFLICT(name) DO 
      update
      set
         email = cs.email 
      FROM
         (
            select
               email 
            from
               customers 
            where
               id = 1
         )
         as cs;

以下是查询结构

CREATE TABLE customers (
    id serial PRIMARY KEY,
    name VARCHAR UNIQUE,
    email VARCHAR NOT NULL,
    city VARCHAR NOT NULL
);

我收到了错误消息

syntax error at or near "FROM"
LINE 1: ... ON CONFLICT(name) DO update set email = cs.email FROM (sele...

1 个答案:

答案 0 :(得分:2)

您的子选择结构错误。

如果您需要更新多列,请使用元组分配

INSERT INTOcustomers (name, email, city) 
SELECT 'jack',
       'jack@io' as email,
       city 
FROM customers 
where id = 1 
ON CONFLICT(name) DO 
  update set (email, other_col) = (select email, c2
                                   from customers 
                                   where id = 1)