Tengo que encontrar la id (si hay 5 datos en la base de datos, tengo que conseguir el siguiente disponible insertar lugar que es de 6) en una base de datos MySQL. ¿Cómo puedo hacer eso?
He utilizado MAX(id), pero cuando voy a eliminar algunas filas de la base de datos, todavía mantiene el viejo max valor no actualizar.

  • Así que lo que estamos pidiendo es encontrar la primera identificación. Si usted tiene 5, pero quitar el tercero, luego id 3 debe estar disponible para insertar una nueva fila en?
  • Eso es un mal consejo…la mayoría de las bases de datos de simplemente incrementar a través de un sintética clave. No tratar y reutilizar los viejos valores. Sólo incrementos.
  • Burak: ¿usted quiere encontrar el «siguiente disponible id» (que es max(id) + 1), o la «nueva nunca usada id»?
  • siguiente nunca se usa id
  • Posibles Duplicados de stackoverflow.com/questions/933565/…
  • bram.nosotros/2008/07/30/…

InformationsquelleAutor Burak Dede | 2009-09-10

15 Comentarios

  1. 21

    No creo que nunca se puede estar seguro en el siguiente id, porque alguien podría insertar una nueva fila justo después de que haya pedido el siguiente id. Que al menos la necesidad de una transacción, y si no me equivoco, sólo se puede obtener la identificación real utilizado después de insertar, al menos esa es la forma común de manejo — ver http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

    • Yo defo de acuerdo con este comentario. Para la integridad de los datos siempre iba a generar y utilizar un nuevo número. Si desea utilizar el «no utilizado» id recomiendo hacer un archivo php en un trabajo cron que se ejecuta cuando hay seguramente ninguno de los usuarios en tu web y te «er» a sus filas a los que no se utilicen. Usted tiene que asegurarse de que la actualización del resto de las tablas que se refieren a este, y actualizar en consecuencia.
    • M Grech: «seguramente no hay usuarios en su webapp» – no hay tal cosa, el Internet no tiene horas de trabajo. Dependiendo de «oh, 2 AM GMT+1, por lo tanto no usuarios» será vienen de vuelta y morder (estado allí, hecho eso).
  2. 85

    Actualización 2014-12-05: yo no soy de recomendar este enfoque debido a las razones establecidas en Simon (aceptado) respuesta así como el de Diego comentario. Por favor utilice consulta bajo su propio riesgo.

    El más corto que he encontrado en mysql sitio del desarrollador:

    SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want'

    mente que si usted tiene algunas bases de datos con las mismas tablas, debe especificar el nombre de base de datos, así, así:

    SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want' AND table_schema='the_database_you_want';
    • Esta es la respuesta correcta.
    • Trabajó Como un Encanto! gracias!
    • Esto funciona! +1.
    • Bueno, pero no te olvides! Otros usuarios en la base de datos podría insertar un registro sólo después de realizar esta consulta y antes de insertar el registro. Funciona bien para algunos casos, pero ten en mente!
    • He intentado esto, y devuelve null auto_increment para mí. La tabla que estoy seleccionando tiene 5 registros, un campo llamado id que es la clave primaria. Alguien podría sugerir por qué este es el caso?
    • Este a mi me funciono perfectamente y debe ser la respuesta. +1.
    • La columna debe ser un AutoIncrement columna para obtener el valor de la espalda.
    • La consulta en esta respuesta también puede ser usado para propósitos de prueba (por ejemplo, la comprobación de si una inserción & operación de eliminación que realmente sucedió)

  3. 17

    Además de Lukasz Lysik la respuesta de la IZQUIERDA a UNIRSE tipo de SQL.

    Como yo lo entiendo, si tienen id: 1,2,4,5 debe devolver 3.

    SELECT u.Id + 1 AS FirstAvailableId
    FROM users u
    LEFT JOIN users u1 ON u1.Id = u.Id + 1
    WHERE u1.Id IS NULL
    ORDER BY u.Id
    LIMIT 0, 1

    La esperanza de que ayudará a algunos de los visitantes, aunque los post son bastante antiguos.

    • También, en lugar del límite y el orden, puedes usar min(u.id)+1. No es seguro que el camino es más rápido – probablemente la suya.
  4. 12

    Dado lo que usted dijo en un comentario:

    mi id de columna es auto incremento tengo que conseguir el id y convertirlo a otro base.Así que necesitas para obtener el siguiente id antes de insertar causa convertido código se inserta demasiado.

    Hay una manera de hacer lo que estás pidiendo, que es preguntarle a la mesa lo que el a continuación se inserta la fila id se ser antes de insertar:

    SHOW TABLE STATUS WHERE name = "myTable"

    habrá un campo en el que el conjunto de resultados de la llamada «Auto_increment», que dice la siguiente auto incremento de valor.

    • +1 Este es el más simple, el trabajo de contestar.
  5. 10

    Como yo lo entiendo, si tienen id: 1,2,4,5 debe devolver 3.

    SELECT t1.id + 1
    FROM theTable t1
    WHERE NOT EXISTS (
        SELECT * 
        FROM theTable t2
        WHERE t2.id = t1.id + 1
    )
    LIMIT 1
    • Esto funcionó a la perfección para mí. Gracias!
    • Para su INFORMACIÓN, hay un problema con este código: Si no hay ninguna fila en la tabla, sin embargo, este va a devolver nada.
    • Si hay filas en la tabla, a continuación se esta seguro? Algunas de las otras respuestas sugieren utilizar sólo los nuevos ID, pero sería genial si pudiéramos usar esto y tener la integridad de los datos.
  6. 4

    le dijo:

    mi id de columna es auto incremento tengo
    para obtener el id y convertir a
    otra base.Así que necesito para obtener el siguiente
    id antes de insertar causa convertido código
    se inserta demasiado.

    lo que estás pidiendo es muy peligroso y dará lugar a una condición de carrera. si el código se ejecuta dos veces en el mismo tiempo por diferentes usuarios, ambos de 6 y sus actualizaciones o inserciones se paso el uno del otro.

    sugiero que en lugar INSERT en la tabla, obtener el valor auto_increment utilizando LAST_INSERT_ID() y, a continuación, UPDATE la fila para establecer cualquier valor que depende del valor auto_increment.

  7. 3

    Si desea seleccionar el primer espacio, el uso de este:

    SELECT  @r
    FROM    (
            SELECT  @r := MIN(id) - 1
            FROM    t_source2
            ) vars,
            t_source2
    WHERE   (@r := @r + 1) <> id
    ORDER BY
            id
    LIMIT   1;

    Hay un ANSI la sintaxis de la versión de la misma consulta:

    SELECT  id
    FROM    mytable mo
    WHERE   (
            SELECT  id + 1
            FROM    mytable mi
            WHERE   mi.id < mo.id
            ORDER BY
                    mi.id DESC
            LIMIT 1
            ) <> id
    ORDER BY
            id,
    LIMIT   1

    sin embargo, va a ser lento, debido a que el optimizador de error en MySQL.

    • Corrí pruebas en las variaciones de esta en MySQL 5.5 horas. Estoy fascinado con el enfoque, pero en ningún caso se esta trabajando. En un caso de prueba con 1,2,3,5 en una columna que no está indizada, el primer método devuelve 7. La segunda ANSI alternativo funciona incluso menos de devolver un conflicto 5. Los intentos para mejorar en este diseño se terminó en el errático de la escorrentía de la @r de valor o resultados vacíos, incluidos los intentos de implementar una referencia inicial. Me encantaría ver este trabajo – la idea de crear una variable de bucle sin funciones es emocionante.
  8. 1

    Si usted realmente desea calcular la clave de la inserción siguiente antes de insertar la fila (que es, en mi opinión, no es una muy buena idea), entonces sugiero que utilice el máximo en la actualidad se utiliza el id de más de uno:

    SELECT MAX(id) + 1 FROM table

    Pero yo le sugiero que deje de MySQL para crear la identificación de sí mismo (mediante el uso de un incremento automático de la columna) y el uso de LAST_INSERT_ID() para llegar desde el DBMS. Para ello, utilice una transacción en la que se ejecuta el insertar y, a continuación, la consulta para la identificación como:

    INSERT INTO table (col1) VALUES ("Text");
    SELECT LAST_INSERT_ID();

    La returnset ahora contiene sólo una columna que contiene el id de la recién generado fila.

    • Max no trabajo para borrar pk filas , pensé segundo enfoque es el que no es el mejor y válida……
  9. 1

    De que sea demasiado tarde para responder a esta pregunta, pero espero que esto ayude a alguien.

    @Eimantas ya ha dado la mejor respuesta, pero la solución no funcionará si usted tiene dos o más de las tablas con el mismo nombre en el mismo servidor.

    He modificado ligeramente @Eimantas la respuesta de abordar el problema anterior.

    select Auto_increment as id from information_schema.tables where table_name = 'table_name' and table_schema = 'database_name'
  10. 0

    Una manera de hacerlo es establecer el índice de auto incremento. A continuación, la instrucción SQL simplemente especifica NULO y, a continuación, SQL analizador hace el resto para usted.

    INSERT INTO foo VALUES (null);
    • mi id de columna es auto incremento tengo que conseguir el id y convertirlo a otro base.Así que necesitas para obtener el siguiente id antes de insertar causa convertido código se inserta demasiado.
  11. 0

    Si este es usado en conjunto para la INSERCIÓN de un nuevo registro que usted podría usar algo como esto.

    (Que usted haya declarado en sus comentarios que el id es de auto incremento y la otra tabla, necesita el siguiente ID + 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
    )

    Este es pseudocódigo pero usted consigue la idea

  12. -1

    El problema con muchas de las soluciones es que sólo van a buscar el siguiente, «la BRECHA», mientras se ignora si «1» está disponible, o si no hay filas que van a devolver NULL como la siguiente, «la BRECHA».

    La siguiente no sólo se encuentra disponible la próxima brecha, que va a tener también en cuenta si el primer número disponible es de 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
    • Sé que soy muy tarde, pero podría ser útil para los futuros visitantes como la consulta fue útil para mí 🙂 : usted tiene un extra de paréntesis allí : (SELECT MIN(t.MyID))+1
    • Lo que hace el código (updlock) significa? Banco de trabajo de mostrar un error.
  13. -1

    Esta funcionado bien para mí (MySQL 5.5), resolver el problema de una «partida» de la posición.

    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

    Como se mencionó antes estos tipos de consultas son muy lentos, al menos en MySQL.

  14. -2
    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
    • Esto sería mejor con una explicación de por qué y cómo funciona esto.
  15. -2
    <?php
    Class Database{
        public $db;
        public $host   = DB_HOST;
        public $user   = DB_USER;
        public $pass   = DB_PASS;
        public $dbname = DB_NAME;
    
        public $link;
        public $error;
    
        public function __construct(){
            $this->connectDB();
        }
        private function connectDB(){
        $this->link = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
        if(!$this->link){
            $this->error ="Connection fail".$this->link->connect_error;
            return false;
        }
     }
    
        // Select or Read data
    
        public function select($query){
            $result = $this->link->query($query) or die($this->link->error.__LINE__);
            if($result->num_rows > 0){
                return $result;
            } else {
                return false;
            }
        }
    
    }
     $db = new Database();
    $query = "SELECT * FROM table_name WHERE id > '$current_postid' ORDER BY ID ASC LIMIT 1";
    $postid = $db->select($query);
    if ($postid) {
      while ($result = $postid->fetch_assoc()) { 
            echo $result['id'];
        } 
    
      } ?>
    • Su recomendación podría funcionar para PHP o algún otro lenguaje, pero no para la recta SQL o MySQL.
    • Pidió que MySQL no PHP Servidor o del Lado de la Lógica ….

Dejar respuesta

Please enter your comment!
Please enter your name here