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

您可能还喜欢...

发表回复