2020-10-10 15:17:53
MySQL批量插入数据主要有四种方式,每种方式各有优缺点及适用场景,以下是具体介绍:
单条INSERT语句,多值插入把多条记录的值放在一个INSERT语句里,示例代码如下:
INSERT INTO `your_table` (`column1`, `column2`, `column3`) VALUES('value1_1', 'value1_2', 'value1_3'),('value2_1', 'value2_2', 'value2_3'),('value3_1', 'value3_2', 'value3_3');数据量特别大时,SQL语句会变得非常长,可能超过MySQL的max_allowed_packet限制。
一条SQL语句失败,整个批量插入就失败了。
把多条INSERT语句放在一个事务里,一次性提交,示例代码如下:
START TRANSACTION;INSERT INTO `your_table` (`column1`, `column2`, `column3`) VALUES ('value1_1', 'value1_2', 'value1_3');INSERT INTO `your_table` (`column1`, `column2`, `column3`) VALUES ('value2_1', 'value2_2', 'value2_3');INSERT INTO `your_table` (`column1`, `column2`, `column3`) VALUES ('value3_1', 'value3_2', 'value3_3');COMMIT;可以保证数据的一致性,要么全部成功,要么全部失败。
性能比单条INSERT要好,因为减少了与数据库的交互次数。
这是MySQL官方推荐的批量插入方式,性能最好,它直接从文件中读取数据,然后插入到表中。
首先,把数据整理成一个文本文件,每行一条记录,字段之间用分隔符分隔,示例文件内容如下:
其中,FIELDS TERMINATED BY指定字段分隔符,LINES TERMINATED BY指定行分隔符。
使用LOAD DATA INFILE需要注意权限问题,MySQL服务器进程需要有读取文件的权限。
如果数据文件中包含特殊字符,需要进行转义。
很多编程语言的数据库驱动都提供了批量插入的功能,例如Python的pymysql库可以使用executemany()方法,示例代码如下:
import pymysql# 连接数据库connection = pymysql.connect(host='your_host', user='your_user', password='your_password', database='your_database', cursorclass=pymysql.cursors.DictCursor)try: with connection.cursor() as cursor: # 准备SQL语句 sql = "INSERT INTO `your_table` (`column1`, `column2`, `column3`) VALUES (%s, %s, %s)" # 准备数据 data = [ ('value1_1', 'value1_2', 'value1_3'), ('value2_1', 'value2_2', 'value2_3'), ('value3_1', 'value3_2', 'value3_3'), ] # 执行批量插入 cursor.executemany(sql, data) # 提交事务 connection.commit()finally: connection.close()确保数据库、表、连接都使用相同的字符集,例如UTF-8。