1. 程式人生 > >mysql 存在則更新,不存在則新增

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

最近工作中遇到一些需求,需要對資料庫所有資料進行批量的操作,
即: 存在在則更新,不存在則新增.

# 語句如下:
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