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?

相关推荐
我科绝伦(Huanhuan Zhou)9 天前
Oracle|Oracle SQL*Plus 配置上下翻页功能
数据库·sql·oracle
Cachel wood9 天前
Spark教程6:Spark 底层执行原理详解
大数据·数据库·分布式·计算机网络·spark
IAM四十二9 天前
Google 端侧 AI 框架 LiteRT 初探
android·深度学习·tensorflow
feifeigo1239 天前
Java 正则表达式高级用法
java·mysql·正则表达式
敏叔V5879 天前
大模型Text2SQL之在CentOS上使用yum安装与使用MySQL
linux·mysql·centos
java—大象9 天前
基于java SSM的房屋租赁系统设计和实现
java·开发语言·数据库·spring boot·layui·mybatis
Mutig_s9 天前
Spring Boot动态数据源切换:优雅实现多数据源管理
java·数据库·spring boot·后端·mybatis
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
CYRUS_STUDIO9 天前
手把手教你用 Chrome 断点调试 Frida 脚本,JS 调试不再是黑盒
android·app·逆向
矿渣渣9 天前
SQLite3 在嵌入式系统中的应用指南
数据库·sqlite·嵌入式实时数据库