Alternativa a “PDO::lastInsertId” / “mysql_insert_id”

Siempre oigo que el uso de “lastInsertId” (o mysql_insert_id() si no estás usando PDO) es el mal. En el caso de los factores desencadenantes es evidente, porque podría devolver algo que es totalmente no el último ID que su INSERTAR creado.

$DB->exec("INSERT INTO example (column1) VALUES ('test')");
//Usually returns your newly created ID.
//However when a TRIGGER inserts into another table with auto-increment:
//-> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();

¿Cuál es la alternativa?

OriginalEl autor BlaM | 2008-11-14

6 respuestas

  1. 2

    Si usted va la ruta de ADOdb (http://adodb.sourceforge.net/), entonces usted puede crear la plaquita de IDENTIFICACIÓN antes de la mano de forma explícita y específica de la IDENTIFICACIÓN a la hora de insertar. Esto puede ser implementado portable (ADOdb admite un montón de diferentes bases de datos…), y garantiza que usted está utilizando la correcta inserción de IDENTIFICACIÓN.

    El PostgreSQL SERIE de tipo de datos es similar, excepto que es per-tabla/por-secuencia, se debe especificar la tabla de la secuencia desea que el último ID insertado para cuando usted lo solicite.

    +1 .Escribí mi respuesta como la que estaba escribiendo la tuya
    Se ve muy interesante. Que efecto tiene esta técnica tienen en el rendimiento?
    Sí, pero ¿qué hacer si estás atascado con PDO?
    Usted puede escribir su propio código para hacer lo mismo ADOdb está haciendo, excepto usando PDO. Esencialmente terminar con una tabla separada para almacenar la secuencia, la cual se BLOQUEO de ESCRITURA antes de incrementar el valor de secuencia cuando se captura una nueva ID.
    No debería afectar demasiado el rendimiento, es sólo una forma muy sencilla tabla en la que se bloquea, la obtención de un único registro, el incremento de desbloqueo. No he notado ninguna diferencia de rendimiento en cualquier aplicación que he usado. Recuerde: conseguir trabajo en primer lugar, ajustar el rendimiento posterior.

    OriginalEl autor Keith Palmer Jr.

  2. 4

    Mi humilde opinión es que sólo considera el “mal”, porque casi ninguna otra base de datos SQL (si los hubiere).

    Personalmente me parece muy útil, y espero y deseo que no tuve que recurrir a otros más complicados métodos en otros sistemas.

    Al menos MSSQL tiene la misma característica. En mi antiguo trabajo utilizando la “insertar id” ha causado grandes dolores de cabeza cuando alguien agrega un disparo a una tabla en la que se rompió toda la web – sin razón obvia para aquellos que no saben acerca de que el gatillo…

    OriginalEl autor Alnitak

  3. 3

    Una alternativa es el uso de secuencias de lugar, de modo de generar el ID de ti mismo antes de hacer el insert.

    Por desgracia no son compatibles en MySQL pero las bibliotecas como Adodb puede emular el uso de otra tabla. Creo sin embargo, que la emulación de sí mismo va a utilizar lastInsertId() o equivalente… pero al menos son menos propensos a tener un disparo en una tabla que se utiliza exclusivamente para una secuencia

    OriginalEl autor Tom Haigh

  4. 1

    Supongo que no es realmente el estado de la técnica, pero yo uso bloqueos de escritura para asegurarse de que realmente conseguir el último ID insertado.

    Obviamente también de trabajar pero en mi humilde opinión de bloqueo es aún más mal en el alto rendimiento de las aplicaciones web…

    OriginalEl autor markus

  5. 0

    No es sofisticado y no es eficiente, pero si los datos que he introducido incluyen campos únicos, a continuación, SELECCIONE una, obviamente, puede producir lo que usted está después.

    Por ejemplo:

    INSERT INTO example (column1) VALUES ('test');
    SELECT id FROM example WHERE column1 = 'test';
    Obviamente 😉 – Pero también, obviamente, muy feo 😉

    OriginalEl autor Peter Howe

  6. -3

    Usted podría intentar esto:

    $sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
    $PS = $DB -> prepare($sql);
    $PS -> execute();
    $result = $PS -> fetch();
    Esa no es una alternativa de alto tráfico entornos. Usted obtener constantemente mal IDs.

    OriginalEl autor mikeyD

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *