mysql 批量插入数据如何防止重复插入,。mysql 批量插入时,部分失败,python操作mysql批量插入,Python+mysql 使用唯一索引( on duplicate key update)避免插入重复数据
Python+mysql 使用唯一索引( on duplicate key update)避免插入重复数据
Python 如何使用唯一索引( on duplicate key update)避免向mysql数据库插入重复数据
这是我在python中向数据库中更新的数据。 每分钟大概500条数据,其中(candles,time_stamp,futures_type)会有大量重复数据。
sql_insert = "INSERT INTO okex (date,candles,time_stamp,futures_type,open,high,low,close,volume) VALUES ('%s','%s','%s','%s','%.2f','%.2f','%.2f','%.2f','%.2f')" % (
today, arr_a[3], arr_a[9], arr_a[25], float(arr_a[11]), float(arr_a[13]),
float(arr_a[15]), float(arr_a[17]), float(arr_a[19]))
唯一索引 update的方法。它的sql 用法(来自于官方):
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
用法:
1. 在使用之前,我们需要先建立唯一索引
下图中的 candles,time_stamp,futures_type 就是唯一索引
2. 更改python 中的sql insert 代码。
sql_insert = "INSERT INTO okex (date,candles,time_stamp,futures_type,open,high,low,close) VALUES ('%s','%s','%s','%s','%.2f','%.2f','%.2f','%.2f') on duplicate key update " \
"date='%s',candles='%s',time_stamp='%s',futures_type='%s',open='%.2f',high='%.2f',low='%.2f',close='%.2f' "%(
today, arr_a[3], arr_a[9], arr_a[23], float(arr_a[11]), float(arr_a[13]),float(arr_a[15]), float(arr_a[17]),today, arr_a[3], arr_a[9], arr_a[23], float(arr_a[11]), float(arr_a[13]),float(arr_a[15]), float(arr_a[17]))
cursor.execute(sql_insert)
它的结构是
INSERT INTO +你需要插入的数据+ on duplicate key update +你需要覆盖的数据
我这个例子的意思是: 如果 数据库中没有重复项就插入; 如果有重复项则覆盖该项。 (也就是确保无论如何最新的所有值都会写入到数据库中)
参考:https://blog.csdn.net/weixin_39964518/article/details/104223661?spm
mysql 批量插入数据如何防止重复插入
mysql批量插入数据时,会存在重复数据的可能.
解决方法:
1)数据库加联合索引
2)修改sql,忽略重复的数据,防止数据库报错
1.给表创建唯一索引
CREATE TABLE `merchantBlackList` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`createTime` datetime NOT NULL,
`bankId` int(10) DEFAULT NULL COMMENT '银行id',
`merchantSn` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `bankId_merchantSn` (`bankId`,`merchantSn`)//联合索引
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.使用on dupdate key update ,语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。
1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
2,记录已存在时,只会更新on duplicate key update之后指定的字段。
3,如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
<insert id="batchInsert" parameterType="ArrayList">
INSERT INTO merchantBlackList(createTime,bankId,merchantSn)
VALUES
<foreach collection="list" item="item" index="index" separator="," >
(#{item.createTime},#{item.bankId},#{item.merchantSn})
</foreach>
ON DUPLICATE KEY UPDATE
bankId=VALUES(bankId),
merchantSn=VALUES(merchantSn);
</insert>
————————————————
版权声明:本文为CSDN博主「hit、run」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/java_zhulinghai/article/details/127299813
mysql 批量插入时,部分失败
在项目中,会遇到批量插入数据,如果还是使用insert into() values(),只要其中有一条数据失败,整个就失败。
在我们项目中,允许失败,正常的数据需要插入成功。
解决方法:
1.insert ignore into
当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:
INSERT IGNORE INTO books (name) VALUES (1, ‘MySQL’),(1,’JAVA’)
(1, ‘MySQL’)将会插入成功。
2.replace into
如果存在primary or unique相同的记录,则先删除掉。再插入新记录。
REPLACE INTO books (name) VALUES (1, ‘MySQL’),(1,’JAVA’)
(1,’JAVA’)将会插入成功。
————————————————
版权声明:本文为CSDN博主「hello-friend」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangmaohong0717/article/details/83064016
python操作mysql批量插入
一、大量信息插入
通过python向mysql插入大量数据时,可以有两种方法:
1、for + cursor.execute(sql),最后集中提交(commit())
2、cursor.executemany(sql,list)
两种方法效率上和功能上有一定差异。26万条数据,使用第一种方法需要约1.5小时,使用第二种方法只需要10几秒。
executemany的用法:
import pymysql
list_1 = [('a',1),('b',2),(None,3)] # 元素是不是元组都可以
sql_1 = 'insert into 表明(字段1,字段2) values(%s,%s)' # 注意,这里的%s不需要加引号,使用execute需要加引号。另外,executemany 在执行过程中能够将python的None转为sql的null,这一点挺方便的
db = pymysql.connect(host= ....)
cursor = db.cursor()
cursor.executemany(sql_1,list_1)
db.commit()
cursor.close()
db.close()
print('完成')
二、自动提交
在创建连接的时候,增加参数 autocommit = 1 ,当发生update等操作时,会实时更新到数据库内。否则要通过 conn.commit() 来提交到数据库进行具体操作。
如果没有设置自动提交,也没有手动提交,当进行插入或更新等操作时,只在本地客户端能看到更新,在其他客户端或数据库内,数据无变化。
# 实时操作,适合随时少量、频繁的更新
import pymysql
conn = pymysql.connect(
host='XXX.XXX.XXX.XXX',
user='XXXXX',
password='XXXXX',
db='XXXXX',
port=3306,
charset='utf8',
autocommit = 1 ,
)
# 集中大批量操作数据
import pymysql
conn = pymysql.connect(
host='XXX.XXX.XXX.XXX',
user='XXXXX',
password='XXXXX',
db='XXXXX',
port=3306,
charset='utf8',
)
SQl相关操作略
conn.commit() # 提交
————————————————
版权声明:本文为CSDN博主「pxx000000」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pxx000000/article/details/126600034