Oracle Sql语句,用于每行的唯一时间戳

时间:2014-08-21 13:43:43

标签: sql oracle

我们在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 个答案:

答案 0 :(得分:2)

以下UPDATE语句将通过增加rownum值的毫秒数来保证每行具有唯一的MY_TIMESTAMP值。

修改在Alessandro Rossi指出可能存在重复值之后,以下查询已被修改为使用SYSTIMESTAMP进行更新。

  UPDATE ITEM_HISTORY 
  SET my_timestamp = SYSTIMESTAMP + NUMTODSINTERVAL(rownum/1000, 'SECOND');

但是,建议您使用替代策略,例如添加另一列来存储键值。