我有下表结构的表
ACC_ID ACC_TIMESTAMP
3369376 01-DEC-16 07.21.10
3369379 01-DEC-16 07.25.06
3369371 01-DEC-16 07.30.29
3377485 11-DEC-16 07.47.20
序列详情:
CREATED 15-APR-14 09.38.45
LAST_DDL_TIME 15-APR-14 09.38.45
SEQUENCE_OWNER ACC
SEQUENCE_NAME ACC_SEQ
MIN_VALUE 1
MAX_VALUE 999999999999999999999999999
INCREMENT_BY 1
CYCLE_FLAG N
ORDER_FLAG N
CACHE_SIZE 20
LAST_NUMBER 87884
如果我按照ACC_TIMESTAMP顺序对表进行排序,我会看到在01-DEC-16 07.30.29处插入的主键值3369371较小。如果在01-DEC-16 07.21.10处插入了更高的值3369376,怎么可能?我的代码期望增加的有序主键应该与时间戳对应。
我认为将ORDER_FLAG设置为Y将遵循基于时间戳的顺序(先到先得)。请帮忙。
输出应为:
ACC_ID ACC_TIMESTAMP
3369376 01-DEC-16 07.21.10
3369379 01-DEC-16 07.25.06
3369381 01-DEC-16 07.30.29 // something higher value like this, but overall sort on both timestamp and PK value.
3377485 11-DEC-16 07.47.20
答案 0 :(得分:1)
<强> ORDER 强>
指定ORDER以保证在其中生成序列号 请求顺序。如果使用序列,则此子句很有用 数字作为时间戳。保证订单通常并不重要 用于生成主键的序列。
答案 1 :(得分:1)
序列在SGA中管理。请参阅JSCH - Invalid private key,但基本上数据库会按请求顺序递增序列。
除非您在RAC上。默认情况下,RAC节点各自维护自己的序列值缓存,因此数字以块的形式运行,并且来自不同节点的数字是交错的。
但是如果你不在RAC上?也许在应用程序代码中有一些地方,ID和TIMESTAMP没有在同一语句中被抓取。或更新TIMESTAMP的地方。在不知道如何填充ID和TIMESTAMP列的情况下,很难解释。
此外,您发布的序列详细说明了......
LAST_NUMBER 87884
...但您发布的ACC_ID要大两个数量级。那么也许ACC_ID实际上是由其他一些机制生成的?
“我的代码期望增加的有序主键应与时间戳对应。”
这是一个不明智的政策。除非您可以保证两个列都填充在同一个语句中并且永远不会被篡改,否则您应该选择一个来提供创建顺序。由于序列主要提供唯一标识符的保证来源,因此您应该依赖时间戳。
但是如果它真的对你很重要并且你在RAC上,那么一定要使用ORDER子句来保证请求顺序:
alter sequence ACC_SEQ order;