2011-02-09 80 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;