Нахождение следующего доступного идентификатора в MySQL - PullRequest
49 голосов
/ 10 сентября 2009

Мне нужно найти следующий доступный идентификатор (если в базе данных 5 данных, я должен получить следующее доступное место вставки, равное 6) в базе данных MySQL. Как я могу это сделать? Я использовал MAX(id), но когда я удаляю несколько строк из базы данных, он все еще содержит старое максимальное значение, которое он не обновил.

Ответы [ 15 ]

0 голосов
/ 07 июня 2016
SELECT ID+1 "NEXTID" 
FROM ( 
    SELECT ID from TABLE1 
    WHERE ID>100 order by ID
) "X" 
WHERE not exists (
    SELECT 1 FROM TABLE1 t2
    WHERE t2.ID=X.ID+1
) 
LIMIT 1
0 голосов
/ 09 декабря 2015

Это хорошо сработало для меня (MySQL 5.5), также решая проблему «стартовой» позиции.

SELECT
    IF(res.nextID, res.nextID, @r) AS nextID
FROM
    (SELECT @r := 30) AS vars,
    (
    SELECT MIN(t1.id + 1) AS nextID
    FROM test t1
    LEFT JOIN test t2
      ON t1.id + 1 = t2.id
    WHERE t1.id >= @r
      AND t2.id IS NULL
      AND EXISTS (
          SELECT id
          FROM test
          WHERE id = @r
      )
  LIMIT 1
  ) AS res
LIMIT 1

Как упоминалось ранее, эти типы запросов очень медленные, по крайней мере, в MySQL.

0 голосов
/ 05 марта 2012

Проблема многих решений заключается в том, что они находят только следующий «GAP», игнорируя, если «1» доступно, или если строк нет, они возвращают NULL в качестве следующего «GAP».

Следующее не только найдет следующий доступный пробел, но также примет во внимание, если первый доступный номер равен 1:

SELECT CASE WHEN MIN(MyID) IS NULL OR MIN(MyID)>1
-- return 1 if it's available or if there are no rows yet
THEN
    1
ELSE -- find next gap
    (SELECT MIN(t.MyID)+1
    FROM MyTable t (updlock)
    WHERE NOT EXISTS (SELECT NULL FROM MyTable n WHERE n.MyID=t.MyID+1))
END AS NextID
FROM MyTable
0 голосов
/ 10 сентября 2009

Если это используется вместе для ВСТАВКИ новой записи, вы можете использовать что-то вроде этого.

(Вы указали в своих комментариях, что идентификатор автоматически увеличивается, а другой таблице нужен следующий идентификатор + 1)

INSERT INTO TABLE2 (id, field1, field2, field3, etc) 
VALUES(
   SELECT (MAX(id) + 1), field1, field2, field3, etc FROM TABLE1
   WHERE condition_here_if_needed
)

Это псевдокод, но вы поняли

0 голосов
/ 10 сентября 2009

Один из способов сделать это - установить индекс с автоматическим приращением. Тогда ваш оператор SQL просто указывает NULL, а затем анализатор SQL сделает все остальное за вас.

INSERT INTO foo VALUES (null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...