自動インクリメントシリアル番号フィールドSLNOを持つテーブルAがあります。テーブルに値を挿入すると、1、2、3、4などのように自動的に増加しますが、テーブルから行を削除すると、順序が壊れます。つまり、シリアル番号 2 の行を削除すると、シリアル番号フィールドは 1、3、4 になります。しかし、行を削除しても 1,2,3 のような連続した順序を維持したいのです。トリガーなどを使用するなど、この順序を維持する方法はありますか
5 に答える
プライマリ自動インクリメント キーは、レコードを一意に識別するためだけのものです。そのままにしておいてください。
主キーをレコード順序の指標として誤用しないでください。レコードの特定の順序が必要な場合は、そのために追加の列を使用してください。たとえば、timestamp
列。
レコードの特定の順序が必要な場合はtimestamp
、既定値が の列を使用しますcurrent_timestamp
。そうすれば、自動的に挿入されます。
ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;
SQLFiddle デモ
レコードの数を保存すると、削除が非効率になります。代わりに、すでに持っている既存の SLNO インデックスに頼ることができます。それは、私の頭に浮かぶすべてのユースケースに十分なはずです。
の場合SELECT whatever ORDER BY SLNO LIMIT ... OFFSET k
、返される行の ID は k、k+1、k+2、...
SLNO を知っているレコードの ID を取得する場合:
SELECT COUNT(SLNO) FROM A WHERE SLNO <= thatnumber
thatnumber'th
レコードを取得する場合:
SELECT * FROM A ORDER BY SLNO LIMIT 1 OFFSET thatnumber
削除されたことを特定する列を追加します
例:
1 - すでに削除済み
0 - 削除されていません
選択クエリに where deleted = 0 を追加します
primary key column 2 column3 ..... deleted
1 1
2 0
3 0
4 1
5 0
そのままにしておくべきです。
ただし、本当に必要な場合は、主キーであるインデックスを「再計算」できます。
set @pk:=0;
update
your_table
set pk=@pk:=@pk+1
order by pk;
テーブルを変更して主キーを削除してから、再度主キーを作成することで実行できます。
しかし、なぜこれが必要なのですか。このキーを他のテーブルの外部キーとして使用している場合。その後、すべてのデータを失いました。