web-dev-qa-db-ja.com

行順に欠損値を取得するにはどうすればよいですか?

テーブルで、多くの行が削除されました。次のINSERTで欠落している行のIDを取得する方法は?

例えば

id      col1
1       1
3       3
4       4
5       5
8       8
9       9

次のINSERTで使用可能な最初のIDの値を取得するにはどうすればよいですか。ここでid = 2を取得します。

何かのようなもの

SELECT id+1 FROM table WHERE CLAUSE // pointing to the least available value
// or x = id +1 (after SELECT)
INSERT INTO table (id, ....) VALUES ('x', ....)
3
Googlebot

このようなクエリを使用すると、最初に利用可能なidを取得できます

SELECT id + 1 available_id
  FROM table1 t
 WHERE NOT EXISTS
(
  SELECT * 
    FROM table1
   WHERE id = t.id + 1
)
 ORDER BY id
 LIMIT 1

出力:

 | AVAILABLE_ID | 
 | ----------- | 2 | 

これは---(SQLFiddleデモです


挿入するには

INSERT INTO table1 (id, col1, ...)
SELECT id + 1, <some_value>, ...
  FROM table1 t
 WHERE NOT EXISTS
(
  SELECT * 
    FROM table1
   WHERE id = t.id + 1
)
 ORDER BY id
 LIMIT 1;

これはSQLFiddleデモです

4
peterm

ユーザー定義変数を使用できます。最善の解決策ではありませんが、それは役に立つ場合があります。

set @raw_number = (select ID - 1
from names
LIMIT 1);
select @raw_number as RESULT
from names
where ID > @raw_number := @raw_number + 1
LIMIT 1;
1
diofloyk