我使用以下定义为Teradata标识列创建了一个表:
ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 100000000 NO CYCLE), ---- UNIQUE PRIMARY INDEX ( ID )
几个月来,ID列一直正常工作,自动为列生成唯一值。然而,在过去一个月中,ELMAH已经间歇地从我们的.NET 4.0 ASP.NET应用程序报告以下异常:
Teradata.Client.Provider.TdException: [Teradata Database] [2801] Duplicate unique prime key error in DATABASENAME.TABLENAME.
我能够通过打开SQL Assistant并使用原始SQL将一堆记录插入表中来复制它。正如预期的那样,它大部分时间都会成功插入,但有时会引发上述异常。
看来这个错误正在发生,因为Teradata正在尝试为之前生成的此列生成一个值。
有没有人知道如何深入了解正在发生的事情?至少,我想要一些方法来更深入地调试问题。
答案 0 :(得分:0)
我建议将您的标识列的定义更改为GENERATED ALWAYS
,以防止应用程序或ETL过程提供可能已使用的值。事实上,Teradata建议,如果您使用IDENTITY
列作为UPI的一部分,则应将其定义为GENERATED ALWAYS ... NO CYCLE
修改强>
如果您的业务要求必须能够提供值,我还会考虑使用超出您为IDENTITY
列预留的值范围的域。您可以使用负数域或超出IDENTITY列的数量级的范围。个人偏好是使用否定域名。