You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:06:13