Pregunta

Siempre escucho eso usando " lastInsertId " (o mysql_insert_id () si no estás usando PDO) es malo. En caso de desencadenantes, obviamente lo es, porque podría devolver algo que no es la última ID 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?

¿Fue útil?

Solución

Si sigue la ruta de ADOdb ( http://adodb.sourceforge.net/ ), entonces puede crear la ID de inserción de antemano y especificar específicamente la ID al insertarla. Esto se puede implementar de forma portátil (ADOdb admite una tonelada de bases de datos diferentes ...) y garantiza que está utilizando la ID de inserción correcta.

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

Otros consejos

En mi humilde opinión, solo se considera '' malvado '' porque casi ninguna otra base de datos SQL (si la hay) la tiene.

Personalmente, lo encuentro increíblemente útil, y deseo no tener que recurrir a otros métodos más complicados en otros sistemas.

Una alternativa es usar secuencias en su lugar, de modo que genere la ID usted mismo antes de hacer la inserción.

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

Supongo que tampoco es lo más avanzado, pero uso bloqueos de escritura para asegurarme de que realmente obtengo la última ID insertada.

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

Por ejemplo:

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

Puedes probar esto:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top