在mysql数据库操作中,INSERT语句是向表中写入数据的核心命令,支持多种插入场景,能够满足不同业务下的数据新增需求。不管是单条数据写入还是批量数据导入,都可以通过INSERT语句的不同写法实现。
INSERT语句基础语法
最基础的INSERT语句用于向表中所有字段插入一条完整数据,语法格式如下:
-- 向表中所有字段插入数据,需要按照表字段定义的顺序依次传入值 INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);
假设我们有一张用户表user,表结构包含id、username、age、create_time四个字段,插入一条完整数据的示例如下:
-- 插入一条完整的用户数据 INSERT INTO user VALUES (1, '张三', 25, '2024-05-20 10:30:00');
插入指定字段的数据
实际开发中往往不需要向所有字段插入数据,比如自增主键id、有默认值的create_time字段可以省略,此时需要显式指定要插入的字段名,语法格式如下:
-- 向指定字段插入数据,未指定的字段会使用默认值或者允许为空 INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
针对上面的user表,插入指定字段数据的示例如下:
-- 只插入username和age字段,id自增,create_time使用默认值
INSERT INTO user (username, age) VALUES ('李四', 28);
批量插入多条数据
如果需要一次性插入多条数据,不需要多次执行INSERT语句,可以通过一条INSERT语句实现批量插入,减少数据库交互次数,提升插入效率,语法格式如下:
-- 批量插入多条数据,每个括号对应一条数据的值 INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1_1, 值1_2, ...), (值2_1, 值2_2, ...), (值3_1, 值3_2, ...);
批量插入user表数据的示例如下:
-- 一次性插入三条用户数据
INSERT INTO user (username, age) VALUES
('王五', 22),
('赵六', 30),
('孙七', 26);
插入时处理重复数据
当表中存在唯一约束的字段时,插入重复数据会报错,此时可以使用INSERT IGNORE或者ON DUPLICATE KEY UPDATE语法处理重复场景。
忽略重复数据
使用INSERT IGNORE时,如果遇到重复的唯一键值,语句不会报错,只是跳过该条数据的插入,语法如下:
-- 插入数据,如果遇到重复的唯一键则忽略该条插入 INSERT IGNORE INTO user (id, username, age) VALUES (1, '张三', 25);
重复时更新数据
如果希望插入时遇到重复唯一键则更新已有数据,可以使用ON DUPLICATE KEY UPDATE语法,示例如下:
-- 插入数据,如果id重复则更新age字段 INSERT INTO user (id, username, age) VALUES (1, '张三', 26) ON DUPLICATE KEY UPDATE age = VALUES(age);
INSERT语句使用注意事项
- 插入的值的类型需要和对应字段的类型匹配,比如数值类型字段不能插入字符串,否则会报错。
- 插入的字符串值需要用单引号包裹,日期时间类型的值也建议使用单引号包裹。
- 批量插入时,单次插入的数据量不宜过大,避免超过mysql的
max_allowed_packet参数限制。 - 如果表有自增主键,插入时不要手动指定自增字段的值,除非明确需要自定义自增值。