Teradata插入数据时生成递减唯一ID的可行实现方案问询
Teradata插入递减唯一ID的可行方案
方案1:插入时动态计算ID(推荐,单次插入场景最易用)
直接在INSERT语句中结合现有表最小ID和窗口函数生成符合要求的ID,无需额外创建序列或临时表,不会出现语法报错。
示例SQL如下:
-- 假设待插入数据存放在临时表tmp_source中,也可以替换为你的SELECT查询语句 INSERT INTO 目标表名 (id, aa, bb) SELECT (SELECT MIN(id) FROM 目标表名) - ROW_NUMBER() OVER(ORDER BY 1) AS id, aa, bb FROM tmp_source;
逻辑说明:先取目标表当前最小ID(示例中为-5),ROW_NUMBER从1开始自增,第一条新数据ID为-5-1=-6,第二条为-5-2=-7,完全符合依次递减的要求。
方案2:修复序列语法使用序列生成ID
你之前的报错是序列创建语法错误导致的,Teradata中创建递减序列的正确语法如下:
CREATE SEQUENCE 序列名 START WITH -6 -- 第一次取数直接得到-6 INCREMENT BY -1 MINVALUE -32768 -- smallint类型最小值为-32768,避免溢出 MAXVALUE -5 NOCYCLE; -- 如果需要会话级序列,加上VOLATILE关键词:CREATE VOLATILE SEQUENCE 序列名
插入时调用序列即可:
INSERT INTO 目标表名 (id, aa, bb) SELECT 序列名.NEXTVAL, aa, bb FROM tmp_source;
注意事项
目标表ID为smallint类型,取值范围是-32768 ~ 32767,新插入数据量最多不能超过32763条(当前最小ID为-5,最多可再生成32763个小于-5的合法ID),超出会报类型溢出错误。
内容的提问来源于stack exchange,提问作者mado
相关产品推荐
相关产品推荐

