Frage

Ich höre immer, dass es böse ist, "lastInsertid" (oder mySQL_insert_id () zu verwenden, wenn Sie nicht PDO verwenden). Bei Triggern ist es offensichtlich, weil es etwas zurückgeben könnte, das völlig nicht die letzte ID ist, die Ihr Einsatz erstellt hat.

$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();

Was ist die Alternative?

War es hilfreich?

Lösung

Wenn Sie die Route von adodb gehen (http://adodb.sourceforge.net/), dann können Sie die Einfügen -ID erstellen vorweg und explizit spezifisch die ID beim Einfügen. Dies kann portabel implementiert werden (ADODB unterstützt eine Menge verschiedener Datenbanken ...) und garantiert, dass Sie die richtige Einfügungs -ID verwenden.

Der serielle Datentyp nach postgreSQL ist ähnlich, außer dass er pro Tisch/pro-Sequenz ist. Sie geben die Tabelle/Sequenz an, für die Sie die letzte Einfügungs-ID erhalten möchten, wenn Sie sie anfordern.

Andere Tipps

IMHO Es wird nur als "böse" angesehen, weil kaum eine andere SQL -Datenbank (falls vorhanden) sie hat.

Persönlich finde ich es unglaublich nützlich und wünschte, ich müsste nicht auf andere kompliziertere Methoden auf anderen Systemen zurückgreifen.

Eine Alternative besteht darin, stattdessen Sequenzen zu verwenden, sodass Sie die ID selbst erstellen, bevor Sie den Einfügen durchführen.

Leider werden sie in MySQL nicht unterstützt, aber Bibliotheken wie ADODB können sie mit einer anderen Tabelle emulieren. Ich denke jedoch, dass die Emulation selbst lastInSertid () oder gleichwertig verwenden wird ... aber zumindest ist es weniger wahrscheinlich, dass Sie einen Auslöser auf einer Tabelle haben, die nur für eine Sequenz verwendet wird

Ich denke, es ist auch nicht wirklich hoches Kunst, aber ich verwende Schreibschlösser, um sicherzustellen, dass ich wirklich die letzte eingefügte ID bekomme.

Es ist nicht anspruchsvoll und nicht effizient, aber wenn die von Ihnen eingefügten Daten eindeutige Felder enthalten, kann ein Auswahl offensichtlich das ergeben, was Sie suchen.

Zum Beispiel:

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

Sie könnten dies versuchen:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top