使用INSERT INTO批量插入时如何为每条记录生成不同sysid值
批量插入时为每行生成不重复sysid的实现方法
所有插入记录sysid重复的核心原因是插入语句里给sysid赋了固定常量值,只要把sysid的赋值逻辑换成逐行动态生成的唯一值,不需要拆分批量插入语句就能实现需求,常用实现方式分两类:
- 优先方案:给目标表sysid列配置默认自动生成规则(性能最好、最稳妥)
直接修改目标表字段属性,让数据库自动为新插入的行分配唯一sysid,插入语句不需要手动指定sysid字段,完全不会出现重复问题:- 适用MySQL、MariaDB:将sysid设为自增字段
-- 修改sysid字段为自增属性 ALTER TABLE target_table MODIFY COLUMN sysid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY; -- 批量插入时仅传入源表3个字段即可,sysid由数据库自动生成 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table; - 适用PostgreSQL、Oracle:为sysid绑定序列默认值
-- PostgreSQL创建序列并绑定到字段示例 CREATE SEQUENCE IF NOT EXISTS target_table_sysid_seq; ALTER TABLE target_table ALTER COLUMN sysid SET DEFAULT nextval('target_table_sysid_seq'); -- 插入语句和MySQL场景一致,无需手动传入sysid INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table;
- 适用MySQL、MariaDB:将sysid设为自增字段
- 备选方案:无表结构修改权限时,在插入查询中动态生成唯一sysid
如果不能修改目标表结构,可以在查询源表数据时,逐行生成唯一值作为sysid,单条语句完成批量插入:- 全局唯一ID方案(跨数据库通用,无主键冲突风险)
根据使用的数据库选择对应的内置UUID生成函数即可,生成的ID全局不重复:INSERT INTO target_table (sysid, col1, col2, col3) SELECT -- MySQL替换为UUID(),PostgreSQL替换为gen_random_uuid(),SQL Server替换为NEWID() UUID() AS sysid, col1, col2, col3 FROM source_table; - 有序数字ID方案(生成连续递增的数字ID)
用窗口函数按查询结果生成逐行递增的行号,可叠加表内已有sysid的最大值作为基准,避免和历史数据冲突:INSERT INTO target_table (sysid, col1, col2, col3) SELECT ROW_NUMBER() OVER (ORDER BY col1) + (SELECT COALESCE(MAX(sysid), 0) FROM target_table) AS sysid, col1, col2, col3 FROM source_table;
- 全局唯一ID方案(跨数据库通用,无主键冲突风险)
避坑提示:不要在INSERT语句中给sysid传入固定常量、未随行变化的会话变量,否则必然出现所有插入行sysid取值相同的问题。
内容的提问来源于stack exchange,提问作者luffy 390
相关产品推荐
相关产品推荐

