首页 > 解决方案 > Postgresq / Python,将更新和插入查询变成一个查询,仅当记录不存在时才插入

问题描述

我正在使用以下两个查询(在 PostgreSQL/Python 中):

query_update = """UPDATE my_table
               SET {}='{}'
               WHERE index={}""".format(*[str(updated_columns), str(updated_values), str(updated_row_indices)])

query_insert = """INSERT INTO my_table ({})
                   VALUES ('{}')""".format(*[str(updated_columns), str(updated_values), str(updated_row_indices)])

而不是这两个查询,我只想有一个查询,如果它不退出,它将自动插入记录。我有两个问题:

  1. 如何使用 PostgreSQL 将这两个查询合并为一个查询?(重要的)
  2. 如何使用 MySQL 做同样的事情?(可选的)

标签: mysqlpostgresql

解决方案


不需要 query_update

ON CONFLICT子句添加到您的 query_insert变量。

query_insert = """INSERT INTO my_table ({})
                   VALUES ('{}')
ON CONFLICT ({}) DO
UPDATE
   SET {}""".format(*[str(columns_to_insert), str(column_values), str(key_columns)], str(column_values_update))

在这里, columns_to_insert应该是您插入数据的列的逗号分隔列表; column_values应该是以逗号分隔的columns_to_insert值列表; key_columns应该是一个逗号分隔的主键列列表; column_values_update应该是一个逗号分隔的column_name=column_value对列表(类似于常规 UPDATE 命令)。


推荐阅读