2012-01-05 9 views
1

私はM 2のレコードを持つデータベースを持って、問題がある:私は約10 000を削除しなければならなかった、そして今、私はこの問題を持って、IDがアイデンティティ列をギャップなしで連続した状態に保つにはどうすればよいですか?

ID: 100 
ID: 102 
ID: 103 
... 

例えば、失われます、これを整理する方法?つまり、これ以降のすべてのIDを「穴」なしに置き換えますか?覚えておきますが、私は200万以上のレコードを持っています(1日あたり15,000以上)。手動では実行できません。

私が必要:

ID: 101 
ID: 102 
ID: 103 
... 
+6

この質問はよく聞かれます。他の場所で参照整合性を壊す可能性があるため、ギャップを埋めることは通常はお勧めできません。 auto_increment IDは通常は重要な列ではないので、ギャップがあるかどうかは実際には関係ありません。あなたは、あなたが持っているレコードの数を見るためにidを使ってはいけません。 –

+2

「穴」を削除する理由は何ですか?彼らのようなidsを保つ。それでも問題はありません。 –

+0

私はそれらを順番にしたい、参照としての問題はありません。 –

答えて

0

すべてのレコードをソーステーブルに格納し、次にINSERTレコードを2番目のテーブルに格納すると、どのレコードが適格かを確認できます。これは通常、非常に簡単です:

INSERT INTO b_table (a, b, c) SELECT a, b, c FROM a_table 

あなたはあなただけの両側からそれを残して自動インクリメントIDフィールドを持っており、それがb_table側、順次、ギャップなしでそれを再作成されます場合。あなたが好きなときにあなたが完了したら、a_tableからレコードをパージすることができます。

4

ギャップを埋めるしないでください。既存の行の番号を変更することは、特にPKフィールドの場合は、本当に悪い考えです。たとえば、社会保障番号が連続していなければならないと決めた場合、混乱を埋めるために人々が死んだときにそれらをすべて降ろしたとしたら、それが起こる混乱について考えてみてください。だから、他の人に属していたID番号が頻繁に変更されることになります。

代理キーが良好な場合、実際の値は意味を持たないはずです。したがって、ギャップも意味を持ちません。

もしあなたが心配しているのであれば、実際にそれらを削除するのではなく、isDeletedビットフィールドとフラグレコードを追加するだけではいかがですか?ボラ、隙間なし!

番号を増やす必要がある場合は(行番号など)、do it in your queriesとすると、維持管理の手間が省けます。

+0

おそらく、booleanフィールドとして 'removed'を呼び出す方が意味がない' isDelete'よりも優れています。 'visible'フラグをデフォルトでtrueにするなど、inverseを使用することも可能です。" removed "の場合はfalseです。 – tadman

+0

私は理論が同じだと思います。フィールドの名前やtrue/false =削除されたかどうかは関係ありません。 – JohnFx

関連する問題