如何修改插入测试数据的SQL实现数据库自动生成ID避免重复
解决方案
你的Hibernate配置中已经指定了id使用IDENTITY自增策略,说明onboarding_tasks表的id字段本身已经是自增主键,只需要调整插入SQL,省略id字段的手动赋值,让数据库自动生成即可。
第一步:确认表结构配置(对应你的Hibernate注解逻辑)
不同数据库的自增主键配置对应如下:
- MySQL:id字段添加
AUTO_INCREMENT属性 - PostgreSQL:id字段类型设为
BIGSERIAL,或手动绑定自增序列 - SQL Server:id字段添加
IDENTITY(1,1)属性
第二步:修改插入SQL
你原SQL使用了PostgreSQL的generate_series函数,修改后写法如下:
INSERT INTO onboarding_tasks (business_name) SELECT 'ABC name ' || generate_series(1,10);
如果是MySQL环境,没有内置generate_series函数,可使用递归CTE实现批量插入:
WITH RECURSIVE num AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM num WHERE n < 10 ) INSERT INTO onboarding_tasks (business_name) SELECT CONCAT('ABC name ', n) FROM num;
原理说明
调整后的SQL不会手动指定id值,数据库会基于当前表中已有的最大id值自动向后生成新的唯一id,即使重试运行插入语句,也不会出现主键重复冲突,和你Hibernate中@GeneratedValue(strategy = GenerationType.IDENTITY)的底层逻辑完全一致。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

