PostgreSQL 10:如何使用约束添加唯一值,默认值为-1

问题描述 投票:1回答:1

我希望用约束添加唯一值,并将-1的默认值添加到termoldestyear

ALTER TABLE live_mytable
    ADD CONSTRAINT live_mytable_uq
    UNIQUE (id,loan_type,coalesce(term,-1),coalesce(oldestyear, -1));

因为我的目标是能够upsert - 如果set不存在则插入并且如果存在冲突则更新apr列(如果set存在但apr值不同):

INSERT INTO live_mytable(id, loan_type, apr, term, oldestyear) 
SELECT id, loan_type, apr, term, oldestyear
FROM   imp_mytable
  ON CONFLICT (id,loan_type,term,oldestyear) 
  DO UPDATE SET
     apr = excluded.apr;

我需要一个默认值-1的原因是因为unique不能识别空值,而termoldestyear列可以为null。

我是PostgreSQL的新手,所以我不确定我的方法是否正确。

我的桌子设计:enter image description here

id       |loan_type      |apr   |term|oldestyear|
---------|---------------|------|----|----------|
    68459|auto new       |  3.50|  48|          |
    68459|auto new       |  3.50|  60|          |
    68459|auto new       |  3.99|  72|          |
    68459|auto used      |  3.24|  36|          |
    68459|auto used      |  3.74|  48|          |
    68459|auto used      |  3.74|  60|          |
    68459|auto used      |  3.99|  72|          |
    10066|auto new       |  2.99|  36|          |
    10066|auto new       |  3.29|  48|          |

我的问题是,如果imp_mytablelive_mytable可以为空,我怎么能从termoldestyear。并且只有当唯一集匹配时apr不同才会更新。

postgresql upsert postgresql-10
1个回答
1
投票

使用你当前的数据模型你不能,除非你这样做the old way在PL / pgSQL中有一个循环尝试INSERTUPDATE,直到其中一个成功。

也许您可以使用NULL以外的值来表示列中的缺失值,例如-1。这样可以轻松实现,也可以简化部分查询。

© www.soinside.com 2019 - 2024. All rights reserved.