0

自動インクリメントシリアル番号フィールドSLNOを持つテーブルAがあります。テーブルに値を挿入すると、1、2、3、4などのように自動的に増加しますが、テーブルから行を削除すると、順序が壊れます。つまり、シリアル番号 2 の行を削除すると、シリアル番号フィールドは 1、3、4 になります。しかし、行を削除しても 1,2,3 のような連続した順序を維持したいのです。トリガーなどを使用するなど、この順序を維持する方法はありますか

4

5 に答える 5

2

プライマリ自動インクリメント キーは、レコードを一意に識別するためだけのものです。そのままにしておいてください。

主キーをレコード順序の指標として誤用しないでください。レコードの特定の順序が必要な場合は、そのために追加の列を使用してください。たとえば、timestamp列。

レコードの特定の順序が必要な場合はtimestamp、既定値が の列を使用しますcurrent_timestamp。そうすれば、自動的に挿入されます。

ALTER TABLE your_table
ADD column inserted_timestamp TIMESTAMP default current_timestamp;

SQLFiddle デモ

于 2013-10-18T05:43:53.937 に答える
0

レコードの数を保存すると、削除が非効率になります。代わりに、すでに持っている既存の 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
于 2013-10-21T10:03:29.710 に答える
0

削除されたことを特定する列を追加します

例:

1 - すでに削除済み

0 - 削除されていません

選択クエリに where deleted = 0 を追加します

primary key column 2 column3 ..... deleted
1                                    1
2                                    0
3                                    0
4                                    1
5                                    0
于 2013-10-21T08:01:26.373 に答える
0

そのままにしておくべきです。

ただし、本当に必要な場合は、主キーであるインデックスを「再計算」できます。

set @pk:=0;

update 
  your_table
  set pk=@pk:=@pk+1
  order by pk;   
于 2013-10-18T06:23:11.097 に答える
-1

テーブルを変更して主キーを削除してから、再度主キーを作成することで実行できます。

しかし、なぜこれが必要なのですか。このキーを他のテーブルの外部キーとして使用している場合。その後、すべてのデータを失いました。

于 2013-10-18T05:44:24.220 に答える