使用Postgres动态更新表行,而不删除以前的字段

时间:2017-05-24 09:23:01

标签: sql postgresql upsert

这可能是一个重复的问题,但我找不到解决问题的好方法。

我在Postgres中只有这样的一行:

 username         |   date   |       status        |        account_id        | last_update  | account_type |                     iban                     |                    email                     |                business_name                 
--------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
 tMCjBPQjE+9C     | 17-05-12 | CANCELLED           | axFOU38iBWRnfcAW11H7lg== | 16:42:17.962 | B            |                                              |                                         

我希望你能看到,有些专栏没有该字段。 现在完美,我的问题是: 如果我想更新该行,并且假设我所拥有的行没有account_id值但是状态不同,所以我需要更新它。更新的结果将是更新状态字段,以及account_id,它将为空。那是我的问题。 我不想更新已填充信息的字段,但仅在实际更改时才更新。这需要是动态的,因为我不知道哪些字段将是空的或不是,但我所知道的是,如果该字段已经存在,那么它很好,如果新行不包含则不能更新它。

因此,例如,此行是与PK(USERNAME AND DATE)匹配的行,其状态与已存储在表中的行不同。

     username     |   date   |       status        |        account_id        | last_update  | account_type |                     iban                     |                    email                     |                business_name                 
    --------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
     tMCjBPQjE+9C | 17-05-12 | NEW                 |                          | 16:42:17.962 | B            |                                              |      

如您所见,上面的行具有不同的状态,密钥用户名和日期匹配,所以我需要更新!但是在更新中,字段account_id不能更新,因为我已经有了一个值,已经存在了!

这必须对表中的每个元素都有效,所以假设下一行有email, iban字段而不是account_id,我需要更新我没有的字段但是不要碰我已经拥有的那个。

对于前一个示例,输出应该是:

 username         |   date   |       status        |        account_id        | last_update  | account_type |                     iban                     |                    email                     |                business_name                 
--------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
 tMCjBPQjE+9C     | 17-05-12 | NEW                 | axFOU38iBWRnfcAW11H7lg== | 16:42:17.962 | B            |                                              |           

现在,这是我的政治家,它可能与预期不同,因为我正在使用Logstash输出插件来执行UPSERT功能。

INSERT INTO users VALUES(?,?,?,?,?,?)
          on conflict (username,date)

          do update set (date,status, firstname, lastname, last_update) = (?,?,?,?,?)
          where users.username = ? "
          , "%{[request][username]}","%{date}","%{status}", "%{firstname}", "%{lastname}","%{time}","%{date}","%{status}", "%{firstname}", "%{lastname}","%{time}","%{[request][username]}"

每个?的映射方式是第一个?"%{[request][username]}",第二个是"%{date}"等等。此语句有效,它执行更新和插入但是当我按照我的描述进行更新时,并没有做我想要的“动态”工作。

对不起,如果我没有解释清楚,请告诉我你是否需要进一步澄清这个问题。

0 个答案:

没有答案