我希望用约束添加唯一值,并将-1
的默认值添加到term
和oldestyear
:
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不能识别空值,而term
和oldestyear
列可以为null。
我是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
不同才会更新。
使用你当前的数据模型你不能,除非你这样做the old way在PL / pgSQL中有一个循环尝试INSERT
和UPDATE
,直到其中一个成功。
也许您可以使用NULL以外的值来表示列中的缺失值,例如-1。这样可以轻松实现,也可以简化部分查询。