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

Siempre escuché que usar “lastInsertId” (o mysql_insert_id () si no estás usando PDO) es malo. En el caso de los desencadenadores, obviamente lo es, porque podría devolver algo que no es totalmente la última identificación que creó su INSERT.

$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?

Si sigue la ruta de ADOdb ( http://adodb.sourceforge.net/ ), puede crear la ID de inserción de antemano y especificar explícitamente la ID al insertarla. Esto puede implementarse de manera portátil (ADOdb admite una tonelada de diferentes bases de datos …) y garantiza que está utilizando la ID de inserción correcta.

El tipo de datos SERGALES de PostgreSQL es similar, excepto que es por tabla / por secuencia, usted especifica la tabla / secuencia para la cual desea la última ID de inserción cuando la solicita.

En mi humilde opinión solo se considera “malo” porque casi ninguna otra base de datos SQL (si lo hay) lo tiene.

Personalmente, me parece increíblemente útil, y me gustaría no tener que recurrir a otros métodos más complicados en otros sistemas.

Una alternativa es usar secuencias en su lugar, por lo que debe generar la identificación antes de hacer la inserción.

Desafortunadamente no son compatibles con MySQL pero las bibliotecas como Adodb pueden emularlas usando otra tabla. Sin embargo, creo que la emulación usará lastInsertId () o equivalente … pero al menos es menos probable que tenga un disparador en una tabla que se usa puramente para una secuencia

Supongo que tampoco es realmente lo último en tecnología, pero uso lockings de escritura para asegurarme de que realmente obtengo la última identificación insertada.

No es sofisticado y no es eficiente, pero si los datos que ha insertado incluyen campos únicos, entonces un SELECT puede obviamente dar lo que está buscando.

Por ejemplo:

 INSERT INTO example (column1) VALUES ('test'); SELECT id FROM example WHERE column1 = 'test'; 

Puedes intentar esto:

 $sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1"; $PS = $DB -> prepare($sql); $PS -> execute(); $result = $PS -> fetch();