insert语句怎么写:三种常用写法
insert语句怎么写,标准基础格式为insertinto表名(字段1,字段2)values(值1,值2),可省略字段列表、批量插入多行,也可搭配select实现查询结果写入表;你写语句时,字符串、日期类型的值必须加单引号,数值类型不加,字段数量、数据类型、顺序要和values里的值一一对应,主键非空字段必须提供有效值,该语法适用于MySQL、SQLServer、PostgreSQL主流数据库,但批量插入语法细节存在差异,Oracle低版本不支持一条语句插入多行。
insert语句基础单行写法
基础单行插入会明确列出目标字段,可控性更强,推荐开发环境优先使用。示例:insertintostudent(id,name,age)values(1,'张三',18);括号内字段列表顺序可以和数据表字段顺序不一致,只要values内数值顺序同步调整即可。明确写字段列表,后续数据表新增字段时,原有插入代码不会直接报错,兼容性更好。
省略字段列表的写法为insertintostudentvalues(2,'李四',20);这种写法要求values里的值必须完整覆盖表中全部字段,顺序严格匹配建表时字段排列顺序,只要表结构改动,语句大概率执行失败,适合临时快速测试,不建议在正式业务代码中使用。
insert语句批量插入写法
批量插入可以减少数据库连接交互次数,在数据量较大场景下,写入性能会明显优于循环执行单行insert。语法示例:insertintostudent(id,name,age)values(3,'王五',19),(4,'赵六',21),(5,'孙七',17);每组括号代表一行数据,组之间用逗号分隔,末尾只写一个分号。
| 数据库 | 是否支持多行values | 单行最大行数参考 |
|---|---|---|
| MySQL | 支持 | 单条语句建议不超过1000行 |
| SQLServer | 支持 | 单条语句建议不超过1000行 |
| Oracle11g及更早 | 不支持 | 需用unionall实现批量 |
批量插入单次写入行数不要无限增大,数据量过大容易触发数据库数据包超限,出现语句执行失败。Oracle11g及更早版本,不能直接使用多组values,需要用insertinto表名select...unionallselect...的方式实现多行写入。
insert语句结合select查询写入
这种写法不从代码传入固定值,直接把查询结果插入目标表,常用于数据迁移、表复制、数据备份场景。示例:insertintostudent_backup(id,name,age)selectid,name,agefromstudentwhereage>=18;select查询返回的字段数量、数据类型,必须和前面insert指定字段保持匹配。
查询结果写入目标表时,数据库不会额外校验重复主键,当查询出来的数据和目标表主键冲突,整条insert语句会执行失败,已经写入的行会根据数据库事务配置进行回滚。你可以提前通过select语句验证查询结果,确认主键不存在重复后再执行插入。
字符串值必须包裹单引号。
日期类型数据同样使用单引号,例如'2026-10-16',布尔、整数类型不需要引号。如果字段设置了默认值,你不在insert语句里传入该字段,数据库会自动填充预设默认值;标记为自增的主键字段,不需要手动填写数值,直接不在字段列表中写出即可。
主键冲突会直接终止插入。如果需要主键冲突时跳过或者更新数据,MySQL可以使用insert...onduplicatekeyupdate,SQLServer使用merge语句,不同数据库扩展语法互不通用,移植代码时需要单独改写。
该语法的适用边界是,不能直接向只读视图、分区表不允许写入的分区插入数据,触发器、外键约束也会拦截不符合规则的insert语句,执行前需要确认目标表的约束配置。
