这有效:
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 );
答案 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.