Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obtenho o primeiro ID não utilizado na tabela?


Eu nomeei sua tabela unused .
SELECT  id
FROM    (
        SELECT  1 AS id
        ) q1
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    unused
        WHERE   id = 1
        )
UNION ALL
SELECT  *
FROM    (
        SELECT  id + 1
        FROM    unused t
        WHERE   NOT EXISTS
                (
                SELECT  1
                FROM    unused ti
                WHERE   ti.id = t.id + 1
                )
        ORDER BY
                id
        LIMIT 1
        ) q2
ORDER BY
        id
LIMIT 1

Esta consulta consiste em duas partes.

A primeira parte:
SELECT  *
FROM    (
        SELECT  1 AS id
        ) q
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    unused
        WHERE   id = 1
        )

seleciona um 1 se não há nenhuma entrada na tabela com este id .

A segunda parte:
SELECT  *
FROM    (
        SELECT  id + 1
        FROM    unused t
        WHERE   NOT EXISTS
                (
                SELECT  1
                FROM    unused ti
                WHERE   ti.id = t.id + 1
                )
        ORDER BY
                id
        LIMIT 1
        ) q2

seleciona um primeiro id na tabela para a qual não há próximo id .

A consulta resultante seleciona o menor desses dois valores.