mysql 存在則更新,不存在則新增
阿新 • • 發佈:2019-01-05
最近工作中遇到一些需求,需要對資料庫所有資料進行批量的操作,
即: 存在在則更新,不存在則新增.
# 語句如下:
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()