如何在IF ELSE分支中生成不重复的唯一ID?
解决插入数据时生成唯一ID的方案
当前代码里不管走IF还是ELSE分支,都是用ROW_NUMBER()从1生成id,必然会导致重复。以下是几种靠谱的解决办法:
方法1:基于现有表最大ID续号
直接在生成行号的基础上,加上当前my_table里已有的最大ID,这样新插入的ID会从现有最大ID之后开始连续递增,不会重复。
修改后的插入语句(两个分支通用):
Insert into my_table Select (COALESCE((SELECT MAX(id) FROM my_table), 0) + ROW_NUMBER() OVER (ORDER BY id)) as id, now(), total From my_table2;
COALESCE是为了处理my_table为空的情况(此时MAX(id)返回NULL,加0后从1开始生成ID)。- 如果
my_table已有数据,新ID会从现有最大ID+1开始依次生成。
方法2:设置自增主键(推荐)
把my_table的id字段设为自增主键,让数据库自动帮你生成唯一ID,这是最省心且不易出错的方案。
步骤1:修改表结构(以MySQL为例)
ALTER TABLE my_table MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
如果是PostgreSQL,用SERIAL类型:
ALTER TABLE my_table ALTER COLUMN id TYPE SERIAL; ALTER TABLE my_table ADD PRIMARY KEY (id);
步骤2:修改插入语句
不需要手动指定id字段,直接插入其他字段即可:
-- IF分支和ELSE分支都用这个语句 Insert into my_table (create_time, total) -- 这里替换成你实际的时间字段名 Select now(), total From my_table2;
数据库会自动为每一行分配唯一的递增ID,完全避免重复问题。
方法3:使用UUID生成全局唯一ID
如果不需要ID是连续的数值,可以用UUID生成字符串类型的唯一ID,适合分布式场景:
Insert into my_table Select UUID() as id, now(), total From my_table2;
注意:此时my_table的id字段需要改成VARCHAR(36)类型来存储UUID。
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

