2011-02-09 95 views
2

我已经与SQL Server进行了广泛的合作,但对Oracle有很少的经验。我已经完成了在Oracle数据库中“清理”序列的任务,但我不确定如何安全地执行此操作。清理Oracle序列

我需要确定表中实际的最大值(比如ID = 105)。然后查看该ID的下一个序列是什么。如果是106,那么一切都会很好。如果它是110,那么我需要将它重置为106.

我可以安全地删除一个序列然后重新创建它,或者将那个已经存在的主键碎片化?我猜这不会是一个问题,但在我将别人的系统升级之前,我想问一下。

这是我要使用

Drop Sequence blah.foo_seq 
Create Sequence blah.foo_seq Start WIth 106 Min 1 Max 2147483647 yada yada 
+3

如果你真的需要连续的数字,序列是不正确的工具使用。 – cagcowboy 2011-02-09 17:47:27

回答

11

我一般是持谨慎态度需要“清理” Oracle序列的命令。由于Oracle序列不能用于生成无间隙值,如果110会导致应用程序出现问题,则需要解决更大的问题。

删除序列对主键没有影响。但它会使引用序列的任何对象失效并删除所有特权授予。在重新创建序列后,您可以重新编译代码,这是删除可能存在问题的权限。

避免了需要处理失去特权是改变增量由参数减小序列值的另一种方法,即

ALTER SEQUENCE foo_seq 
    INCREMENT BY -4; 

SELECT foo_seq.nextval 
    FROM dual; 

ALTER SEQUENCE foo_seq 
    INCREMENT BY 1;