我希望将具有约束且默认值为-1
的唯一值添加到term
和oldestyear
:
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
是因为唯一不识别空值,并且列term
和oldestyear
可以为空。
我是PostgreSQL的新手,所以不确定我的方法是否正确。
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_mytable
和live_mytable
可以为空,如何从term
到oldestyear
升序。并且只有在唯一集匹配时apr
不同时才更新。
答案 0 :(得分:1)
除非使用{/ 3}在PL / pgSQL中尝试INSERT
和UPDATE
直到其中之一成功,否则无法使用当前数据模型。
也许您可以使用NULL以外的值来表示列中的缺失值,例如-1。这样会很容易,也可能会简化您的某些查询。