mysql 存在则更新,不存在则新增

版权声明:诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/84394435

最近工作中遇到一些需求,需要对数据库所有数据进行批量的操作,
即: 存在在则更新,不存在则新增.

# 语句如下:
insert into test_tbl (id,dr) 
values (1,'2'),(2,'3'),...(x,'y') 
on duplicate key update dr=values(dr);
/*解析:
test_tbl 是表名
(id, dr) 是该的两个字段,
(1, '2'), (2, '3'),...(x, 'y')则需要插入的值
update dr = values(dr) 存在则更新
*/
# 例子:
insert into book (`Id`,`Author`,`CreatedTime`,`UpdatedTime`) 
values (1,'张飞2','2017-12-12 12:20','2017-12-12 12:20'),
(2,'关羽2','2017-12-12 12:20','2017-12-12 12:20')
on duplicate key update 
Author=values(Author),
CreatedTime=values(CreatedTime),
UpdatedTime=values(UpdatedTime);

扩展:

# 使用case when 方法
UPDATE test_tbl
    SET name = CASE id
        WHEN 1 THEN '刘德华'
        WHEN 2 THEN '张学友'
        WHEN 3 THEN '张国荣'
    END,
    name_py = CASE id
        WHEN 1 THEN 'ldf'
        WHEN 2 THEN 'zxy'
        WHEN 3 THEN 'zgr'
    END
WHERE id IN (1,2,3)

批量更新解决思路:

若有10000条数据需要进行’update’, 那就分批进行commit()
下面是具体的实现: (未测试)
使用的sql语句是:

sql_one = '''update schma.table set col = {val}  where col2 = {val2}'''
# 其中的schma是指数据库
# table是指数据表
# col是需要更新的字段名
# val是需要更新的值
# col2 = val2是受影响的行
# 总体意思是:将schma数据库的table表中的col2 = {val2} 这些行中的 col列的值更新为 {val}
# 带{为变量}
import pymysql
import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)


conn = pymysql.connect()  # 创建数据库连接
val_list = [('test1', 1), ('test2', 2)...]
i = 0
for val in val_list:
	sql = sql_one.format(val=val[0], val2=val[1])
	try:
	    cur = conn.cursor()
	    a = cur.execute(sql)
	except Exception as e:
	    conn.rollback()
	    logger.debug(e)
	else:
		i += 1
	if i == 1000:  # 当 i == 1000时提交事务且将i重置为0
		i = 0
		conn.commit()
conn.commit() # 兜底提交
cur.close()
conn.close()


也可以参与这个: https://www.cnblogs.com/Eric-zhao/p/6655994.html

猜你喜欢

转载自blog.csdn.net/weixin_39791387/article/details/84394435