mysql如何使用insert语句_mysql数据插入操作讲解

来源:这里教程网 时间:2026-02-28 20:49:32 作者:

INSERT 语句写错主键或唯一键会直接报错

MySQL 遇到重复的

PRIMARY KEY
UNIQUE
值时,不会静默覆盖,而是抛出错误:
ERROR 1062 (23000): Duplicate entry 'xxx' for key 'yyy'
。这不是语法问题,是约束拦截。

想跳过冲突继续插下一条,用
INSERT IGNORE
—— 但注意:它对所有警告(包括字段截断、类型转换)都静默忽略,不推荐无差别使用
想冲突时更新已有行,用
INSERT ... ON DUPLICATE KEY UPDATE
,只触发一次 SQL,比先查再插再更安全
想严格保证不重复且失败即止,就用原生
INSERT
,靠应用层捕获
1062
错误做后续处理

VALUES 里混用 NULL 和空字符串容易引发逻辑 bug

NULL
表示“未知/不存在”,空字符串
''
是一个确定的、长度为 0 的字符串,二者在索引、排序、
COUNT()
GROUP BY
中行为完全不同。

WHERE column = ''
查不到
NULL
值;
WHERE column IS NULL
也查不到
''
如果字段定义为
NOT NULL
但没设默认值,插
NULL
会报错:
ERROR 1048 (23000): Column 'xxx' cannot be null
批量导入时,CSV 中缺失字段常被转成
NULL
,而业务可能期望是
''
,需在
INSERT
前用
COALESCE(col, '')
或应用层兜底

批量插入用 VALUES 多组比循环单条快一个数量级

单条

INSERT INTO t(a,b) VALUES (1,2)
走一次网络往返 + 一次事务开销;100 条这样插,就是 100 次。合并后:
INSERT INTO t(a,b) VALUES (1,2), (3,4), (5,6)
,一次提交即可。

MySQL 默认单次
max_allowed_packet
限制约 4MB,别一次性塞几万行,建议每批 1000–5000 行
如果表有大量索引,关掉再开(
ALTER TABLE t DISABLE KEYS
)能提速,但仅适用于 MyISAM;InnoDB 不支持,得靠调大
innodb_buffer_pool_size
和关掉唯一检查(
SET unique_checks=0
)临时加速
LOAD DATA INFILE
比拼接
VALUES
更快,但要求文件在 MySQL 服务端磁盘上,且需
FILE
权限

没有显式指定列名的 INSERT 在表结构变更后极易崩

写成

INSERT INTO t VALUES (1,'a',NOW())
看似简洁,但只要表加了新字段(尤其非空无默认值)、删了字段、或调整了字段顺序,这条语句立刻失效,报错:
ERROR 1136 (21S01): Column count doesn't match value count at row 1

永远显式写出列名:
INSERT INTO t(id,name,created_at) VALUES (1,'a',NOW())
如果字段多,用程序生成列名列表比手敲靠谱;IDE 或客户端工具(如 DBeaver)可自动生成带列名的模板 视图或临时表上执行
INSERT
时,列名必须与视图 SELECT 列完全一致,不能依赖底层表结构

最麻烦的不是语法错,是那种「上线后跑了一周才因某张表加字段突然挂掉」的情况——列名省那几个字,换来的往往是半夜三点的报警电话。

相关推荐