1

auto-incrementデータベース内のすべての新しいエントリに ID を割り当てるために使用しています。また、現在のページ番号に従って、このデータベースから 10 個のエントリを選択する php スクリプトがあります。たとえば、現在のページが 2 の場合、スクリプトは id=20 から id=29 までのすべてのエントリを選択する必要があります。

ここで、エントリを削除すると、ID が失われます。したがって、id28 が削除された場合、スクリプトは 9 つのエントリのみを表示します。

auto-incremente レコードが削除された後に値を再割り当てする方法はありますか?

4

6 に答える 6

5

これは通常、望ましいと考えられています。エントリ番号28が削除された場合、エントリは二度とありません28。誰かがそれを参照しようとした場合、彼らは明らかに削除されたものを参照しようとしているので、エラーを報告することができます。

戻って28新しいエントリに再割り当てした場合、その人が古い 28レコードを意味するのか、新しいレコードを意味するのかがわかりません。

一歩下がって、やりたいことをもう一度見てみましょう。あなたの目標は、20との間の10個のエントリを表示しないこと30です。あなたの目標は、あなたの基準を満たす10のエントリを表示することです。LIMITそのために、組み込みのOFFSET用語を使用できます。

SELECT ...
FROM ...
WHERE ...
OFFSET 29
LIMIT 10

OFFSETMySQLにカウントを開始する場所を指示し、カウントする数をLIMIT指示します。MySQLは結果セット全体をまとめ、30番目から始まる10個のエントリを提供します。これが結果の4ページ目です。今では、彼らがたまたま持っているIDは重要ではありません。

于 2012-07-08T11:51:12.993 に答える
3

ページのエントリを選択する方法を変更する必要があります。

LIMIT .. OFFSET句を使用すると、N番目のエントリから始まる10個のエントリを選択できます。

SELECT   *
FROM     table
ORDER BY id
LIMIT    10
OFFSET   19
  • LIMIT 1010行のみを返すことを意味します
  • OFFSET 1919行目以降の行を返すことを意味します

このように、一部のIDが削除されていて、IDが連続していないかどうかは関係ありません。

オフセットを変更するだけです。

  • ページ1=>オフセット0
  • ページ2=>オフセット9
  • ページ3=>オフセット19
  • ページN=>オフセット(N-1)* 10-1
于 2012-07-08T11:50:43.337 に答える
1

あなたの質問は次のようなクエリを提案します

SELECT columns FROM table WHERE id BETWEEN 20 AND 29;

またはあまりエレガントではない

SELECT columns FROM table WHERE id >= 20 AND id <= 29;

もしそうなら、私はあなたがLIMIT節を読んで、次の行に沿って何かをすることをお勧めします

SELECT columns FROM table ORDER BY id LIMIT 20, 10;
于 2012-07-08T11:51:41.917 に答える
1

できますが、すべきではありません。id=29 が存在する場合、自動インクリメントを 28 にリセットすると、自動インクリメントが id=29 を使用したいのにレコードが既に存在する場合に問題が発生します。

次のようにクエリを記述したほうがよいでしょう。

select * from table order by ID LIMIT n,10;

nはページ番号*10

于 2012-07-08T11:52:24.967 に答える
1

自動インクリメント値を再割り当てするのは悪い習慣です.idは他のテーブルとの関係で使用される可能性があるためです.オフセット/制限構築を使用し、自動インクリメントの再割り当てを忘れてください:)

于 2012-07-08T11:55:00.833 に答える
1

質問 (auto_increment) に対する直接の回答として、次のクエリでその値を変更できます。

ALTER TABLE `your_table` AUTO_INCREMENT = 200

次に作成されるアイテムでは、次の AI 列の値が 200 に設定されます。これは場合によっては役立ちますが、LIMIT オフセットを使用した方がよいことに同意します。

于 2012-07-08T11:58:34.600 に答える