在具有“重复行错误”的特定列上更新整个表失败

时间:2018-01-11 02:26:55

标签: sql teradata

这有效:

update table_name
set column1=trunc(column1,3);

这不是:

update table_name
set column2=trunc(column2,3);

这两列都不是唯一键或主键。 表结构是:

CREATE SET TABLE TABLE_NAME ,
     NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      KEYCOL NUMBER,
      COLUMN1 FLOAT,
      COLUMN2 FLOAT
)
PRIMARY INDEX ( KEYCOL );    

1 个答案:

答案 0 :(得分:4)

默认情况下,在Teradata会话模式下,将在SET模式下创建不包含SET或MULTISET选项的表。这意味着Teradata将在没有UNIQUE约束的情况下对表执行重复行检查,例如UNIQUE PRIMARY INDEX或UNIQUE SECONDARY INDEX。

在ANSI会话模式下,默认行为相反。 Teradata将创建一个MULTISET表,它允许重复行,并在您拥有非唯一主索引时消除重复行检查的开销。

您是否可以提供SHOW TABLE输出来验证表的结构?您提交的DDL语句不包括表创建中包含的一些默认选项,包括SET与MULTISET,FALLBACK与NO FALLBACK等。

修改 查看更新的表定义后,SET选项是您收到错误的原因。这可能是一件好事或坏事,具体取决于您的意图以及您对表中重复行的容忍度。

要消除错误,您必须将表重建为多集表,或重新考虑您正在应用的更新及其对表中数据的影响。由于这是一个不受约束的更新,您可能会遇到会发生此错误的添加记录。

您可以对表运行SELECT语句,以尝试确定更新生成重复行的次数。您可能必须按表中的每一列进行分组,将正在更新的列替换为具有COUNT(*)>的应用函数。 1.