Teradata标识列与易失性/临时表问题的解决办法问询
解决Teradata易失性表CTAS引用标识列报错的问题
嘿,刚上手Teradata遇到这个问题太正常了~我来给你捋清楚报错原因,以及对应的解决办法:
报错根源
Teradata里的**标识列(Identity Column)**是带特殊自增属性的列,当你用CREATE TABLE AS (CTAS)语句创建表时,CTAS的逻辑是基于查询结果的普通数据生成新表结构,它不会自动继承源表中标识列的特殊属性,反而会因为直接引用标识列的特殊定义触发报错——简单说就是CTAS不支持直接把源表的标识列当作普通列复制。
两种解决方案
根据你的需求不同,有两种处理方式:
1. 只需要标识列的数值,不需要新表列是标识列
这种情况最简单,只需要把源表的标识列转换成普通数值列即可,常用方法是给列做个无意义运算(比如+0),或者显式转换类型,让Teradata把它当成普通列处理:
CREATE MULTISET VOLATILE TABLE Temp_Events AS ( SELECT es.eventSettingId + 0 AS eventSettingId, -- 强制转为普通数值列 evt.lob FROM ForecastDevDW.cal_eventSettings es JOIN ForecastDevDW.cal_eventTypes evt ON evt.eventTypeId = es.eventTypeId ) WITH DATA PRIMARY INDEX (eventSettingId) ON COMMIT PRESERVE ROWS;
也可以用CAST显式转换(如果源列类型是INT,效果和上面一致):
CAST(es.eventSettingId AS INT) AS eventSettingId
2. 需要新表的列也是标识列
如果希望新表的eventSettingId也具备自增的标识属性,那不能用CTAS,得先手动创建表定义,再用INSERT SELECT导入数据:
情况A:新表标识列自增,不需要源表的标识值
-- 先创建带标识列的易失性表 CREATE MULTISET VOLATILE TABLE Temp_Events ( eventSettingId INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), -- 按需设置起始值和增量 lob VARCHAR(100) -- 这里要和源表的lob列类型匹配,自行调整 ) PRIMARY INDEX (eventSettingId) ON COMMIT PRESERVE ROWS; -- 插入数据时,不需要指定标识列(GENERATED ALWAYS会自动生成值) INSERT INTO Temp_Events (lob) SELECT evt.lob FROM ForecastDevDW.cal_eventSettings es JOIN ForecastDevDW.cal_eventTypes evt ON evt.eventTypeId = es.eventTypeId;
情况B:新表标识列要保留源表的数值
如果需要沿用源表的eventSettingId值,创建表时要把标识列设为GENERATED BY DEFAULT(允许手动插入值):
-- 创建表时指定标识列属性 CREATE MULTISET VOLATILE TABLE Temp_Events ( eventSettingId INT GENERATED BY DEFAULT AS IDENTITY (START WITH (SELECT MIN(eventSettingId) FROM ForecastDevDW.cal_eventSettings)), -- 匹配源表起始值 lob VARCHAR(100) ) PRIMARY INDEX (eventSettingId) ON COMMIT PRESERVE ROWS; -- 插入时指定所有列,包括标识列 INSERT INTO Temp_Events (eventSettingId, lob) SELECT es.eventSettingId, evt.lob FROM ForecastDevDW.cal_eventSettings es JOIN ForecastDevDW.cal_eventTypes evt ON evt.eventTypeId = es.eventTypeId;
内容的提问来源于stack exchange,提问作者eTothEipiPlus1
相关产品推荐
相关产品推荐

