MySQL作为常用的关系型数据库,数据插入是最基础的操作之一,掌握单条插入和批量导入的方法能大幅提升数据处理的效率。不管是新增单条用户记录,还是需要导入上万条业务数据,都有对应的合适方案。

单条数据插入操作
MySQL中最基础的插入语句是INSERT INTO,标准语法有两种常见形式,第一种是指定所有字段并对应赋值:
-- 向user表插入一条完整记录,字段顺序和表结构一致 INSERT INTO user VALUES (1, '张三', 25, 'zhangsan@ipipp.com');
第二种是指定需要插入的字段,未指定的字段如果有默认值会使用默认值,没有默认值且非空则会报错:
-- 只插入user表的id、name、age字段,email字段使用默认值 INSERT INTO user (id, name, age) VALUES (2, '李四', 28);
如果插入的数据和表中已有主键或唯一索引冲突,可以使用INSERT IGNORE忽略冲突,或者使用ON DUPLICATE KEY UPDATE更新已有记录:
-- 主键冲突时更新age字段 INSERT INTO user (id, name, age) VALUES (1, '张三', 26) ON DUPLICATE KEY UPDATE age = 26;
批量插入数据方法
当需要插入多条数据时,逐条执行单条插入语句效率很低,MySQL支持在一条INSERT语句中插入多条记录,语法如下:
-- 一次插入3条用户记录 INSERT INTO user (id, name, age) VALUES (3, '王五', 22), (4, '赵六', 30), (5, '孙七', 27);
这种方式的插入效率远高于逐条执行,适合少量到中量级的批量数据插入场景。如果是通过应用程序操作,还可以使用预处理语句批量绑定参数插入,以Python的pymysql为例:
import pymysql
# 连接数据库
conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='test')
cursor = conn.cursor()
# 待插入的数据列表
user_list = [
(6, '周八', 24),
(7, '吴九', 29),
(8, '郑十', 31)
]
# 执行批量插入
sql = "INSERT INTO user (id, name, age) VALUES (%s, %s, %s)"
cursor.executemany(sql, user_list)
conn.commit()
cursor.close()
conn.close()
从外部文件批量导入数据
如果需要导入的数据量非常大,比如几十万甚至上百万条,使用INSERT语句效率会明显下降,此时推荐使用LOAD DATA语句,它可以直接读取外部文件快速导入数据。
首先准备一个符合表结构的文本文件,比如user_data.txt,内容格式如下,字段之间用逗号分隔,行之间用换行分隔:
9,钱十一,25 10,刘十二,32 11,陈十三,23
然后执行导入语句:
-- 从本地文件导入数据到user表,字段分隔符为逗号,行分隔符为换行 LOAD DATA LOCAL INFILE '/path/to/user_data.txt' INTO TABLE user FIELDS TERMINATED BY ',' LINES TERMINATED BY 'n' (id, name, age);
如果文件中有表头行,可以添加IGNORE 1 ROWS忽略第一行:
LOAD DATA LOCAL INFILE '/path/to/user_data.txt' INTO TABLE user FIELDS TERMINATED BY ',' LINES TERMINATED BY 'n' IGNORE 1 ROWS (id, name, age);
插入操作注意事项
- 插入数据时要确保字段类型和值匹配,比如数值字段不能插入字符串,否则会报错。
- 批量插入时单条语句的数据量不宜过大,建议每次插入1000到5000条,避免超过数据库的最大包大小限制。
- 使用
LOAD DATA导入前要确保数据库用户有对应的文件读取权限,同时文件路径要正确。 - 插入大量数据前可以暂时关闭表的索引,插入完成后再重新开启,能提升导入效率。
注意:如果插入的数据包含特殊字符比如单引号,需要在插入值中对单引号进行转义,比如插入名字为O'Neil的用户,值要写成'O'Neil'。