在INSERT中使用WHERE…ON CONFLICT…

时间:2019-01-14 06:15:54

标签: python postgresql psycopg2 upsert

我试图在PostgreSQL中与File "<ipython-input-211-c755485ed830>", line 7 except: continue ^ IndentationError: unexpected unindent 一起使用where子句,并且它不会触发。这是我用python编写的SQL查询。我正在使用psycopg2:

insert on conflict

这是我的python代码,实际上填充了这些python变量:

INSERT INTO city_guide_stat AS stat (city_guide_id, {cols})
VALUES {values}
ON CONFLICT (city_guide_id)
DO UPDATE SET ({update_cols}) = ({update_values})
WHERE stat.city_guide_id = excluded.city_guide_id 
AND md5(({dest_hash_cols})::TEXT)<>md5(({src_hash_cols})::TEXT)

我面临的问题是我的where子句未触发。

1 个答案:

答案 0 :(得分:1)

比较行的文本表示形式的md5是不可靠的,因为输入文本可能与相等的行的输出表示形式不同,例如对于数值:

md5('1.0') <> md5('1') while (1.0) = (1)

如果所有列类型都具有相等运算符,则比较行:

INSERT INTO city_guide_stat AS stat (city_guide_id, {cols})
VALUES {values}
ON CONFLICT (city_guide_id)
DO UPDATE SET ({update_cols}) = ({update_values})
WHERE ({dest_hash_cols}) is distinct from ({src_hash_cols})

否则,您根本无法做到这一点(或仅比较同类产品)。

还请注意

WHERE stat.city_guide_id = excluded.city_guide_id 

是多余的。