すべての行に ID があるテーブルがあり、新しい行を挿入するたびに、最高の ID が取得され、1 が追加されます。存在しない最小の ID を見つけるにはどうすればよいですか? ありがとうございました
4 に答える
同じテーブルで使用LEFT JOIN
して、次の ID が存在するかどうかを確認できます。
この解決策は、多くの行で本当にうまくいくとは思いませんが、うまくいきます:
SELECT (t.id + 1)
FROM `table` as t
LEFT JOIN `table` s ON s.id = (t.id + 1)
WHERE s.id IS NULL
ORDER BY t.id
LIMIT 1
以前に使用された id 値を再使用しないでください。
シナリオ例:
- あなたのサイトに、挑発的なメールを送信する悪質なユーザーがいるとします。電子メールは、ユーザーのプライマリ キー番号を参照します。違反のためにユーザーのアカウントを削除しましたが、メールはまだそこにあります。あなたは削除された ID を新しい適切なユーザーに割り当て直しましたが、彼は自分が責任を負っていない過去の虐待的なメールについて苦情を受け続けています。
自動インクリメント値は一意である必要がありますが、連続している必要はありません。
32 ビットの符号付き整数は、最大 2 31 -1 または 2147483647 にすることができます。64 ビットの符号付き整数は、最大 2 63 -1 または 9223372036854775807 にすることができます。すべての整数を使い切ることはほとんどありません。
MySQL は、最大の値を取得して 1 を追加しません。シーケンス内の次の値を割り当てます。挿入の失敗、行の削除、またはトランザクションのロールバックが原因で、値が欠落している可能性があります。これは正常です。これを回避しようとすると、アプリケーションが遅くなり、複雑になります。自動インクリメント機能を設計どおりに使用し、避けられないギャップがあることを受け入れる必要があります。
例外: MySQL サービスを再起動すると、InnoDB の自動インクリメント値は MAX(id)+1 にリセットされます。
これを試して:
select id+1
from users
where (id+1) not in (select id from users) limit 1
SQLFiddle: http://www.sqlfiddle.com/#!8/3e5a0/5
注、これが使用するのに適したデザインであるかどうかを判断する必要があることを示す他の人々に同意します..数字を再利用しないオプションがある場合は、それを行うことを強くお勧めします...
AUTO_INCREMENT を使用して一意に増加する ID を取得できますが、通常は再利用されません。古い価値観を再利用することで得られるメリットは何ですか?
参照: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html