PostgreSQL 10:如何添加具有约束和默认值-1的唯一

时间:2019-02-28 07:11:34

标签: postgresql upsert postgresql-10

我希望将具有约束且默认值为-1的唯一值添加到termoldestyear

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

因为我的目标是能够向上插入-如果不存在set则进行插入,如果存在冲突则更新apr列(如果set存在但apr的值不同):< / p>

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是因为唯一不识别空值,并且列termoldestyear可以为空。

我是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不同时才更新。

1 个答案:

答案 0 :(得分:1)

除非使用{/ 3}在PL / pgSQL中尝试INSERTUPDATE直到其中之一成功,否则无法使用当前数据模型。

也许您可以使用NULL以外的值来表示列中的缺失值,例如-1。这样会很容易,也可能会简化您的某些查询。