Python使用MySQL,无记录则插入,有记录则更新 - ON DUPLICATE KEY UPDATE

一、基本语法

ON DUPLICATE KEY UPDATE 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。

使用注意事项如下:

  • ON DUPLICATE KEY UPDATE语句根据主键id或唯一键来判断当前插入是否已存在。
  • 记录已存在时,只会更新ON DUPLICATE KEY UPDATE之后指定的字段。
  • 如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。

二、用法示例

下面基于Python语言,给出具体使用示例:

1. 在MySQL中建立 student 表,将code设置为主键,如下所示:

2. 插入基础数据:

3. 使用 ON DUPLICATE KEY UPDATE 更新数据。

假设我们要将第二条记录的name修改为Lily:

python 复制代码
# 数据库连接
conn = pymysql.connect(
    host='172.171.xxx.yyy',
    user='admin',
    passwd='xxxxxx',
    db='asrank',
    port=3306
)

data = ['002', 'Lily']
SQL_FORMAT = """INSERT INTO student VALUES ('{0}', '{1}')  ON DUPLICATE KEY UPDATE name ='{2}' """
sql_1 = SQL_FORMAT.format(data[0], data[1], data[1])
print(sql_1)  # INSERT INTO student VALUES ('002', 'Lily')  ON DUPLICATE KEY UPDATE name ='Lily' 

with conn.cursor() as cursor:
    cursor.execute(sql_1) 
    cursor.close()
conn.commit()  # 提交

查看数据库中,第二条记录中的name已经被更新为Lily,如下所示:

【核心代码】:

写法1:

python 复制代码
data = ['002', 'Lily']
SQL_FORMAT = """INSERT INTO student VALUES ('{0}', '{1}')  ON DUPLICATE KEY UPDATE name ='{2}' """
sql_1 = SQL_FORMAT.format(data[0], data[1], data[1])
print(sql_1)  # INSERT INTO student VALUES ('002', 'Lily')  ON DUPLICATE KEY UPDATE name ='Lily' 

写法2:

python 复制代码
data = ['002', 'Lily']
SQL_FORMAT = "INSERT INTO student VALUES ('%s', '%s') ON DUPLICATE KEY UPDATE name = '%s' "
sql_1 = SQL_FORMAT % (data[0], data[1], data[1])
print(sql_1)  # Insert  INTO student VALUES ('002', 'Lily') ON DUPLICATE KEY UPDATE name = 'Lily' 

三、补充说明

有大佬指出 ON DUPLICATE KEY UPDATE 存在严重的性能和其他隐患问题,推荐改成 先查询一次分出新增集合和修改集合,再分别进行批量新增和批量修改的方式进行,并对批量修改时使用case when的方式实现。

参考地址:为什么不建议使用ON DUPLICATE KEY UPDATE?

相关推荐
余槐i6 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹6 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo6 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
骇客野人7 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台9 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
Lost_the_wind9 小时前
MySQL学习笔记五
mysql
花间相见10 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见10 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing202310 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip