mysql insert语句常见错误包括字段与值数量不匹配、漏括号、字符串未用单引号、使用中文标点等;支持多行插入,语法为insert into t(a,b) values (1,’x’),(2,’y’);insert ignore静默跳过重复键,on duplicate key update则执行更新;跨表插入需注意类型兼容、顺序一致及字符集转换风险。

INSERT INTO 语句写法不对,MySQL 直接报错 Error 1064
常见错误是字段名和值数量不匹配、漏括号、字符串没加引号,或者用了中文标点。MySQL 对语法非常严格,INSERT INTO 后必须跟表名,再跟 VALUES 或 select,中间不能断。
- 字段列表和值列表必须一一对应,个数、顺序、类型都要对得上
- 字符串值必须用单引号
'abc',双引号在某些 SQL 模式下会报错 - 插入 NULL 值时写
NULL(不带引号),不是'NULL' - 如果省略字段名,就得给所有非空且无默认值的字段提供值
想插入多行数据,一条 INSERT 能不能搞定?
能,而且推荐——比发多条 INSERT 更快、更少网络往返。MySQL 支持在 VALUES 后面跟多组括号,每组对应一行。
- 语法是:
INSERT INTO table (a, b) VALUES (1, 'x'), (2, 'y'), (3, 'z'); - 注意逗号分隔的是整行,不是字段;每行括号内字段顺序要一致
- 单条语句插入上限受
max_allowed_packet限制,超了会报ERROR 2006 - 如果其中某一行违反唯一键或非空约束,整条语句会失败(除非加
IGNORE)
INSERT IGNORE 和 ON DUPLICATE KEY UPDATE 有什么区别?
两者都用来处理重复键冲突,但行为完全不同:一个静默跳过,一个主动更新。
-
INSERT IGNORE遇到重复主键或唯一索引时,直接丢弃这一行,不报错也不插入,也不影响其他行 -
ON DUPLICATE KEY UPDATE遇到冲突时,执行指定的更新操作,比如INSERT INTO t (id, name) VALUES (1,'a') ON DUPLICATE KEY UPDATE name='b'; - 后者可以引用新值:
UPDATE count = count + 1,而IGNORE不支持任何后续逻辑 - 注意:只有定义了主键或唯一索引的列触发冲突时,这两个机制才生效
从另一个表导入数据,用 INSERT … SELECT 还要注意啥?
这个写法很常用,但容易忽略字段类型隐式转换、NULL 处理和事务一致性。
- 目标表字段类型必须兼容源表 SELECT 出来的值,否则可能截断或报错(如把长字符串插进
VARCHAR(10)) - SELECT 中的列顺序要和 INSERT 的字段顺序一致,不依赖列名匹配
- 如果源表有大量数据,建议加
LIMIT分批插入,避免锁表太久或日志暴涨 - 注意隔离级别:在
REPEATABLE READ下,INSERT ... SELECT会对源表做间隙锁,可能引发死锁
实际写的时候,最常被绕开又最容易出问题的,是字段类型和字符集隐式转换——尤其是从 utf8mb4 表往老 utf8 表插数据,或者把数字字符串当整数用。这些不会立刻报错,但数据可能被截断或变成 0。