2010-11-20 10 views
-4

私は、テーブルに何かを追加するたびに1ずつインクリメントできるように、1つの列(N)を「アイデンティティ」として設定するテーブルを持っています。行を削除すると、Nを並べ替えるにはどうすればよいですか?アイデンティティ列を再番号付けする

たとえば、テーブルに5つのものを追加した場合、Nは1,2,3,4,5になります。しかし、行3を削除すると、Nは1,2,4,5になります。私は自動的に値を変更してNが1,2,3,4になるようにしたい。

+5

なぜあなたは識別子の番号を変更したいですか?識別されたものを再利用する必要がある場合は、識別子をクラスタード・インデックスとして作成します。 – CarneyCode

答えて

0

あなたそれを行うことができますが、それはひどい考えでしょう。

数が行のデータではなく、あなたがそれらを取得することにしたいれる順番に関連付けられていないので、代わりにすべてのデータベースでこの番号を保存しない方がよいです。より良い解決策は、行番号を動的に生成するためにデータを選択するときに、ソート順列(ギャップを含むことが許される)を使用し、ROW_NUMBERを使用することです。

0

これはやっかいなことですが、tmpテーブルを選択して元のテーブルを切り捨てて、再度挿入することができます。それをトランザクションでまとめてください。

0

これは、アプリケーションのパフォーマンスに影響すると考えています。すべてのIDを並べ替える必要がある場合は、
でコード側(データテーブルの順序を変更して変更を送信)または
2)SQL側(トリガー/ストアドプロシージャ/一時的テーブル)

9

"アイデンティティ"値は、あなたの質問の意味では "カウンター"ではありません。 ID値は、すべての行を一意にし、変更することはできますが、変更するつもりはありません。行カウンタが必要な場合は単純なintまたはbigintにしてから、テーブルトリガを使用して挿入および削除時の値を更新します。

+0

私はたいてい、あなたが「間違っている」と言う答えを嫌っています。私はいつもOPに理由があると思っており、彼らは直接の質問に直接答えなければならない。私はこれが例外かもしれないと思う。 –

+0

@ IainMH、しばしば "あなたはそれを間違っている"と答えた方が良い答えです。それは本当に悪い考えであるときにそれを指摘するのは専門家ではないでしょう。 – HLGEM

0

あなたが望むことをするのは大変な作業です。それが間違っていると、競合状態が発生し、データの整合性に問題が生じます。これは非常にです。

クライアントがこれを尋ねると、「いいえ、それは悪い考えです。開発と保守のコストが大幅に増え、データが不一致になるリスクが大幅に高まりますそれ以前の数字を使った過去のものを調べるときには、問題とは無関係の新しい記録を検索するリスクが大幅に増加する」と語った。 (注文番号の再利用について考えると、古いperssonにはこの注文番号が提供されており、それについて質問するよう呼びかけられましたが、削除して他の人の注文がその場所にあります)。まったく何もない。実際には、ギャップを見たくない強迫的な管理者以外は、レコードをスキップできない状況はほとんどありません。彼らは通常、プロセスにエラーを引き起こす可能性がより高く、大幅にコストがかかることを彼らに説明します。ほとんどの場合、これは開発者の自己課せられた要件であり、あなたがそうでなければ説得することができないクライアントを持っていない限り、これを行うための言い訳は全くありません。

関連する問題