作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 PostgreSQL 中将 where 子句与 insert on conflict
一起使用,但它没有触发。这是我用 python 编写的 SQL 查询。我正在使用 psycopg2:
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)
这是我的 python 代码,它实际上填充了这些 python 变量:
sql_stmt = sql.SQL(UPSERT_CITY_GUIDE_STAT).format(
# Table columns
cols=sql.SQL(', ').join(
map(sql.Identifier, COLUMNS_TO_INSERT_UPDATE)),
# Values
values=sql.SQL(', ').join(
sql.SQL('({})').format(
sql.SQL(', ').join(sql.Placeholder() * (num_columns)),
) * num_batch
),
# Update columns
update_cols=sql.SQL(', ').join(
map(sql.Identifier, COLUMNS_TO_INSERT_UPDATE)),
update_values=sql.SQL(', ').join(map(lambda x: sql.SQL('excluded.{}').format(
sql.Identifier(x)
), COLUMNS_TO_INSERT_UPDATE)),
# hash_cols
dest_hash_cols=sql.SQL(', ').join(map(lambda x: sql.SQL('stat.{}').format(
sql.Identifier(x)
), COLUMNS_TO_INSERT_UPDATE)),
src_hash_cols=sql.SQL(', ').join(map(lambda x: sql.SQL('excluded.{}').format(
sql.Identifier(x)
), COLUMNS_TO_INSERT_UPDATE))
)
我面临的问题是我的 where 子句没有触发。
最佳答案
比较行的文本表示的 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
是多余的。
关于python - 在 INSERT 中使用 WHERE … ON CONFLICT …,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54176538/
我是一名优秀的程序员,十分优秀!