更新全表在特定列上失败,"duplicate row error"



这有效:

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 );    

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

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

您能否提供 SHOW TABLE 输出来验证表的结构?您提交的 DDL 语句省略了表创建中包含的一些默认选项,包括 SET 与 MULTISET、回退与无回退等。

编辑查看更新后的表定义后,SET 选项是出现错误的原因。这可能是一件好事,也可能是坏事,具体取决于您的意图和您对表中重复行的容忍度。

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

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

相关内容

最新更新