2017-11-03 15 views
0

oracleに自動インクリメントの列を作成する方法はありますか?行が削除された場合は、削除された次の値が削除された行を置き換えます。それをオラクルで行う方法はありますか?oracle主キーの連続値

+0

なぜそれをしますか?その列のインクリメンタル値を提供するシーケンスがありますが、古い行を置き換えるためには、a)並行しているユーザーにはうまくいかない、b)オーバーキル(すでに使用されている値にジャンプしないように複雑です。オラクルの頂点とあなたの質問との関係 – Alfabravo

+0

oracleのSequencesを使って自動インクリメントの値を定義することができますが、これは主キーやidのような置換えを使用したくない場合です Oracleには、 'あなたのテーブル名からrowidを選択してください ' – Dean

+0

[OracleでAUTO \ _INCREMENTでIDを作成する方法は?](https://stackoverflow.com/questions/11296361/how-to-create-id-with-auto-インクリメンタル・オン・オラクル) –

答えて

0

(削除後のシーケンスに「穴」がある)その動作は、常にSEQUENCEで発生します。ほとんどのアプリケーションでは、テーブルのidがほとんど人工的で無意味なので、それは良いことであり、完全に機能します。その唯一の用途は、テーブルを関係と結びつけることです。そのために、穴は重要ではありません。

連続したシーケンスを作成してギャップを埋めるには、挿入時にトリガーを作成して、IDをシーケンス内の最初の「穴」の値で更新する必要がありますこのようなSELECT

SELECT MIN(tb.id) + 1 "first_seq_hole" 
    FROM yourTable tb 
WHERE NOT EXISTS 
(SELECT tb.id FROM yourTable tb2 WHERE tb.id + 1 = tb2.id) 

が、けれども私はここにあなたの要件が何であるかわからないが、いくつかの点であなたはまだあなたの順序に穴を持っているかもしれません(あなたがそれらを埋めるためにいずれかを挿入しない10個のランダムな行を削除しないと言います) 。既存のIDを変更して行が削除されたときにすぐにギャップを埋め尽くさない限り、これは避けられません。あなたがそのIDを使って子テーブルを持っているなら、それは複雑で危険です。

+0

大変申し訳ございませんが、私の問題の答えです – blank

+0

クエリは、フィールドに含まれるシーケンスの最初の穴を返します。 [3]と[5]を削除したため[1,2,4,6]があり、次に[3]を挿入することをお勧めします。問合せは、「次の」値を持たない( 'NOT EXISTS'部分)シーケンス内の最初の値(' min(tb.id) ')を確認するために作成されます。その後、その値に1を加えて、シーケンス内の最初の空き値を取得します。 yourTableをテーブル名とidカラムで実際のIDカラム名に置き換える必要があります。 – Dessma

関連する問題