2011-10-26 15 views
2
CREATE TABLE test 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE test1_sequence 
START WITH 1 
INCREMENT BY 1; 

INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Jon'); 
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Hello'); 
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Matt'); 
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Bork'); 

を(削除した後、ID列を調整します)そして、私は自動インクリメント

select * from test; 

をquery-選択しない場合、私はその後、

delete from test where id='2'; 

バイ・このテーブルから1つのレコードを削除した場合としそれから私は得る

ID Name  
    1 Jon  
    3 Matt 
    4 Bork 

私はメインにする必要がある場合私はすべてのデータを削除するとすぐに、それは自動的にIDを調整するように、IDの順序を損なう。だから私は

ID Name  
1 Jon  
2 Matt 
3 Bork 

私はこれを行うことができますどのように任意の提案としてテーブルを取得する必要があります。..

+2

なぜ最初からやりたいのですか? –

+0

@アドリアン、それをしないのいずれかの短所?? – ferhan

+2

@Adrianに同意します。なぜあなたはそれをやりたいのですか?また、そのIDを外部キーとして使用して他のすべての番号を付け直す必要があります。 – Kibbee

答えて

5

私はトムのウェブサイトを依頼記事から記憶が正しければ、シーケンスは、それがギャップ自由な数字を生成することを保証するものではありません。つまり、テーブルを埋める方法とIDを生成する方法では、(行を削除しなくても)100%ギャップフリーになることはありません。

は、ここでそのテーマに関する記事の一つだ:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4343369880986

はまた、主キー列(思われるもの)をアップデートしている心に留めておきます。

私の提案はそれではありません。行の順序付きリストが必要な場合は、ROW_NUMBERを使用し、PKには「アプリケーションの意味」を付けないで代理キーにしておきます。