2008-11-14 11 views
6

Ich höre immer, dass die Verwendung von "lastInsertId" (oder mysql_insert_id(), wenn Sie nicht mit PDO arbeiten) böse ist. Im Falle von Triggern ist es offensichtlich, weil es etwas zurückgeben könnte, das nicht die letzte ID ist, die Ihr INSERT erstellt hat.Alternative zu "PDO :: lastInsertId"/"mysql_insert_id"

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

Antwort

2

Wenn Sie die Route von ADOdb (http://adodb.sourceforge.net/) gehen, dann können Sie die Einfüge-ID vor Hand erstellen und explizit die ID beim Einfügen angeben. Dies kann portabel implementiert werden (ADOdb unterstützt eine Unmenge verschiedener Datenbanken ...) und garantiert, dass Sie die korrekte Einfüge-ID verwenden.

Der PostgreSQL-SERIAL-Datentyp ist ähnlich, mit der Ausnahme, dass es pro Tabelle/pro Sequenz ist. Sie geben die Tabelle/Sequenz an, für die Sie die letzte Einfüge-ID wünschen.

+0

+1 .Ich schrieb meine Antwort, als du deine schreibst –

+0

Sieht ziemlich interessant aus. Welchen Effekt hat diese Technik auf die Performance? – BlaM

+2

Ja, aber was machst du, wenn du mit PDO feststeckst? – Elijah

0

Es ist nicht anspruchsvoll und es ist nicht effizient, aber wenn die Daten, die Sie eingefügt haben, eindeutige Felder enthalten, dann kann ein SELECT offensichtlich ergeben, wonach Sie suchen.

Zum Beispiel:

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

Offensichtlich;) - Aber auch offensichtlich ziemlich hässlich;) – BlaM

1

Ich denke, es ist nicht wirklich Stand der Technik entweder aber ich benutze Schreibsperren, um sicherzustellen, dass ich wirklich die letzte Eingabe-ID erhalten.

+0

Offensichtlich funktioniert auch - aber IMHO Sperren ist noch mehr böse in Hochleistungs-Web-Anwendungen ... – BlaM

4

IMHO wird es nur als "böse" betrachtet, weil kaum eine andere SQL-Datenbank (wenn überhaupt) es hat.

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

+0

Zumindest hat MSSQL die gleiche Funktion. In meinem alten Job mit der "Einfüge-ID" hat große Kopfschmerzen verursacht, wenn jemand einen Trigger zu einer Tabelle, die die ganze Website brach - ohne offensichtlichen Grund für diejenigen, die nicht über diesen Auslöser wissen ... – BlaM

3

Eine Alternative besteht darin, Sequenzen zu verwenden, also generieren Sie die ID selbst, bevor Sie die Einfügung vornehmen.

Leider werden sie in MySQL nicht unterstützt, aber Bibliotheken wie Adodb können sie mit einer anderen Tabelle emulieren. Ich glaube jedoch, dass die Emulation selbst verwenden lastInsertId() oder gleichwertigen ... aber zumindest sind Sie weniger wahrscheinlich einen Trigger auf einem Tisch haben, die rein für eine Sequenz verwendet wird

-3

Sie können diese versuchen:

+3

In stark frequentierten Umgebungen ist das keine Alternative. Sie erhalten ständig falsche IDs. – BlaM