翻老项目代码,看到一句 insert into user set name=?, age=?,第一年写 Java 的我愣了半天,SQL 里还能这么写?其实这是 MySQL 自己的扩展语法,标准 SQL 里没有。
它和 values 写法有什么不同
insert into 表名 set 字段=值, 字段=值,一眼能看出哪个值给哪个字段,列特别多的时候比对着 values 数括号舒服。标准写法 insert into user (name,age) values (?,?) 靠位置对应,插错列是常有的事。
几个容易踩的地方
- 只有 MySQL 认:PostgreSQL、Oracle、SQL Server 都不支持,写进代码后换库会炸。
- MyBatis 要手动拼列名:动态 SQL 得用 trim 或 foreach 判断字段是否为空,否则会插一堆默认值。
- 自增主键别写:留空让数据库生成,硬写 0 在某些严格模式下直接报错。
MyBatis 里的典型写法
insert into user <trim prefix=set suffixOverrides=, > <if test=name!=null> name=#{name}, </if> <if test=age!=null> age=#{age} </if> </trim>关键是 suffixOverrides 会把最后多出来的逗号剪掉,否则 SQL 语法就不合法了。字段多的时候这套写法确实省事。
要不要用看项目
短平快的小接口用 SET 能少写一半列名,调试时一眼看清。但涉及多数据库兼容,或者团队统一用 JPA 那套,还是老老实实 values 更稳。语法糖吃多了,迁移的时候都是债。