0

0

mysql中INSERT INTO语句插入数据的常见方式

P粉602998670

P粉602998670

发布时间:2026-01-11 01:41:08

|

735人浏览过

|

来源于php中文网

原创

MySQL批量插入有四种方式:1. INSERT INTO VALUES适用于小量已知数据;2. INSERT INTO SELECT用于跨表导入;3. INSERT IGNORE/ON DUPLICATE KEY UPDATE处理重复键;4. LOAD DATA INFILE最快,适合百万级本地文件导入。

mysql中insert into语句插入数据的常见方式

INSERT INTO VALUES 一次性插入单行或多行数据

最基础的写法,适合已知全部字段值、数据量不大的场景。注意字段顺序必须和表定义一致,或显式指定列名避免出错。

常见错误:列数和值数量不匹配,报错 Column count doesn't match value count;插入 NULL 到 NOT NULL 字段导致失败。

  • 推荐始终显式列出列名,尤其当表结构后续可能增加字段时
  • 多行插入比多次单行 INSERT 更快,MySQL 会合并为一个事务批次处理
  • 单次插入行数不宜过多(如超过 1000 行),否则可能触发 max_allowed_packet 限制
INSERT INTO users (name, email, created_at) 
VALUES 
('Alice', 'alice@example.com', NOW()),
('Bob', 'bob@example.com', NOW()),
('Charlie', 'charlie@example.com', NOW());

INSERT INTO SELECT 从其他表批量导入数据

适用于迁移、归档、统计汇总等场景,本质是把 SELECT 查询结果作为数据源插入目标表。

关键点:目标表字段类型、长度、约束需兼容查询结果;若目标表有自增主键,SELECT 中通常不提供该列(除非显式设为 NULL 或具体值并关闭 sql_mode=NO_AUTO_VALUE_ON_ZERO)。

  • 不会触发源表的触发器,但会触发目标表的 INSERT 触发器
  • 执行期间会对源表加读锁(InnoDB 下通常是快照读,影响较小;MyISAM 则可能阻塞写)
  • 可配合 WHEREJOIN聚合函数使用,但要注意目标列数与 SELECT 列数严格一致
INSERT INTO user_archive (id, name, email, archived_at)
SELECT id, name, email, NOW() 
FROM users 
WHERE last_login < DATE_SUB(NOW(), INTERVAL 2 YEAR);

INSERT IGNORE 和 ON DUPLICATE KEY UPDATE 处理重复键冲突

当插入数据可能违反 UNIQUE 约束或主键时,两者策略不同:INSERT IGNORE 直接跳过冲突行;ON DUPLICATE KEY UPDATE 则更新已有记录。

雪鸮AI
雪鸮AI

高效便捷的智能绘图辅助工具,一键生成高质量效果图。

下载

容易忽略的坑:IGNORE 会静默吞掉所有警告(包括非主键冲突的其他问题),不利于排查;UPDATE 子句中不能引用被更新行的旧值做计算(如 count = count + 1 是合法的,但 updated_at = old.updated_at 不行)。

  • INSERT IGNORE 返回的 affected_rows 为 0 表示跳过,1 表示插入成功,2 表示“本应插入但因重复被忽略”(仅部分 MySQL 版本)
  • ON DUPLICATE KEY UPDATE 只响应定义了 UNIQUEPRIMARY KEY 的列冲突,普通索引无效
  • 若表有多个唯一键,任一触发都会执行 UPDATE,需确认业务逻辑是否预期如此
INSERT INTO stats (date, page, views) 
VALUES ('2024-06-01', '/home', 120)
ON DUPLICATE KEY UPDATE views = views + 1;

使用 LOAD DATA INFILE 批量导入大文件数据

这是 MySQL 原生最快的批量插入方式,适合从 CSV、TSV 等文本文件导入数十万行以上数据。比拼接 SQL 插入快 20 倍以上。

权限和路径限制最多:需要 FILE 权限;文件必须位于数据库服务器本地(不是客户端);默认只允许 /var/lib/mysql-files/ 等白名单目录(由 secure_file_priv 控制)。

  • 字段分隔符、行结束符、转义字符需与文件格式严格匹配,否则解析错位
  • 建议先用 SHOW VARIABLES LIKE 'secure_file_priv' 查看允许路径
  • 导入前确保目标表无外键约束或临时禁用(SET FOREIGN_KEY_CHECKS = 0),否则速度骤降
LOAD DATA INFILE '/var/lib/mysql-files/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(name, email, @dummy_created_at)
SET created_at = STR_TO_DATE(@dummy_created_at, '%Y-%m-%d %H:%i:%s');
实际用哪一种,取决于数据来源、规模、是否需去重、以及你有没有服务器文件访问权限。小量手工插入用 VALUES,跨表搬运用 SELECT,高频写入带幂等性要求用 ON DUPLICATE KEY UPDATE,而百万级离线导入几乎只能靠 LOAD DATA INFILE —— 其他方式在性能和稳定性上都撑不住。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1094

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 785人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号