用于每行唯一时间戳的 Oracle Sql 语句
Posted
技术标签:
【中文标题】用于每行唯一时间戳的 Oracle Sql 语句【英文标题】:Oracle Sql Statement for unique timestamp for each row 【发布时间】:2014-08-21 13:43:43 【问题描述】:我们在 Oracle DBMS(由遗留应用程序使用)上有下表,其中时间戳是键的一部分(我知道会有更好的方法...)
TABLE ITEM_HISTORY (
ITEM_ID number,
MY_TIMESTAMP TIMESTAMP(7),
...
PRIMARY KEY (ITEM_ID, MY_TIMESTAMP));
只有 ITEM_ID 和 MY_TIMESTAMP 的组合是唯一的。在正在运行的系统上 我们现在需要保证,每个时间戳都是唯一的,因为我们必须 对损坏的数据进行了一些更正,并且对于给定的数据,我们违反了唯一键约束。 通过简单的 MY_TIMESTAMP = SYSTEMTIMESTAMP 更新,所有行 将具有相同的时间戳。
如何使用 SQL 更新我的表,以便每一行都有唯一的时间戳?
更新/说明:
由于我们客户的数据已损坏,我只能尝试尽可能好地更正这些项目。 在某些情况下,损坏表中的项目(具有不同的 ITEM_ID)将被更正 到具有相同 ITEM_ID 的相同项目。要进行此更新,我必须在此之前保证 时间戳不同。
【问题讨论】:
一些想法。 1 - 如果在完全相同的时间插入 2 行会怎样(我知道它们会相隔几毫秒)但是如果时间戳不是那么精确呢? 2 - 您必须重新加载/插入所有数据。没有办法处理表中已经存在的记录。 3 - 您可以构建任何其他类型的唯一标识符吗?可能是auto-increment
?我来自 sql 领域,对 Oracle 不是很熟悉。
您能说明一下您使用的是哪个 DBMS 吗?是 SQL 还是 Oracle?
为唯一键添加一个序列。你为什么要为此使用时间戳呢?您冒着未来数据违反约束的风险。
什么是 TABLE_ID?能改变吗?为什么不专注于此?
我同意 cmets 的观点,即桌子设计得不好。我无法改变这一点。该表在客户处有效,但他们遇到了问题,因为他们导入了无效数据。通过更正我面临的问题的数据,许多时间戳具有完全相同的值。我遇到了问题。
【参考方案1】:
以下UPDATE
语句将通过将毫秒数增加rownum 值来保证每一行都有一个唯一的MY_TIMESTAMP
值。
编辑: 在 Alessandro Rossi 指出可能存在重复值后,已修改以下查询以使用 SYSTIMESTAMP 进行更新。
UPDATE ITEM_HISTORY
SET my_timestamp = SYSTIMESTAMP + NUMTODSINTERVAL(rownum/1000, 'SECOND');
但是,建议您使用替代策略,例如添加另一列来存储键值。
【讨论】:
根本不是一个好的答案!!!!这怎么能行?两个副本都将增加 1 毫秒。它们仍然是重复的,不同之处现在有错误的值!! @AlessandroRossi 您是否尝试运行一些测试?每行的 rownum 将是唯一的,因此即使是相同的 MY_TIMESTAMP 值的增量也会不同。 无论如何:如果第 1 行的值为 0.002,第 2 行的值在 UPDATE 后为 0.001,则它们是重复的,如果表在第 100000000 行有 100000000 行,则该值完全失控。希望清楚这个更新是完全避免的:它可以改变重要的值(想象一下在蒙特卡洛的 Formula1 单圈时间)并且它可以创建新的重复 @AlessandroRossi 我想你可能有一点。我将更改查询以使用 SYSTIMESTAMP。感谢您指出。 我认为时间戳不应该改变,因为它是有意义的。它不应该是主键的一部分,唯一性的焦点应该转移到其他方向。 OP还应该解释为什么他只专注于时间戳列!以上是关于用于每行唯一时间戳的 Oracle Sql 语句的主要内容,如果未能解决你的问题,请参考以下文章