2009-06-17 16 views
1

Ich versuche, die Datenbanktabellen für ein Projekt, an dem ich arbeite, schön und normalisiert zu halten, aber ich habe ein Problem festgestellt. Ich versuche herauszufinden, wie ich eine Zeile in eine Tabelle einfügen und dann herausfinden kann, was der Wert der auto_incremented id Spalte gesetzt wurde, damit ich zusätzliche Daten in eine andere Tabelle einfügen kann. Ich weiß, dass es Funktionen wie mysql_insert_id gibt, die "die ID erhalten, die von der vorherigen INSERT-Operation generiert wurde". Wenn ich mich aber nicht irre, gibt mysql_insert_id nur die ID der allerletzten Operation zurück. Wenn die Site also über genügend Datenverkehr verfügt, gibt dies nicht unbedingt die ID der gewünschten Abfrage zurück, da zwischen dem Einfügen der Zeile und dem Suchen nach der ID möglicherweise eine andere Abfrage ausgeführt wurde. Ist dieses Verständnis von mysql_insert_id korrekt? Alle Vorschläge, wie dies zu tun ist, werden sehr geschätzt. Vielen Dank.Abrufen des Index einer eingefügten Zeile

Antwort

5

LAST_INSERT_ID() hat Sitzungsumfang.

Es wird den Identitätswert zurückgeben, der in der aktuellen Sitzung eingefügt wurde.

Wenn Sie keine Zeilen zwischen INSERT und LAST_INSERT_ID einfügen, wird es in Ordnung sein.

Beachten Sie aber, dass für mehrere Wert Einsätze, wird die Identität der ersten Reihe zurückkehren eingefügt, nicht die letzte:

INSERT 
INTO mytable (identity_column) 
VALUES (NULL) 

SELECT LAST_INSERT_ID() 

-- 
1 

INSERT 
INTO mytable (identity_column) 
VALUES (NULL), (NULL) 

/* This inserts rows 2 and 3 */ 

SELECT LAST_INSERT_ID() 

-- 
2 

/* But this returns 2, not 3 */ 
0

Sie könnten:

A. Angenommen, won‘ t ein Problem und Verwendung mysql_insert_id

oder

B. Fügen Sie einen Zeitstempel in die Zeile ein und rufen Sie die zuletzt eingefügte ID ab, bevor Sie sie in eine andere Tabelle einfügen.

0

Die allgemeine Lösung ist eines von zwei Dingen zu tun:

  1. eine prozedurale Abfrage erstellen, die den Einsatz tut und ruft dann die letzte Eingabe id (. Verwenden, dh LAST_INSERT_ID()) und kehrt zurück es als Ausgabe von der Abfrage.

  2. den Einsatz tun, das andere tun Einsatz, wo die ID-Wert etwas wie ist (wählen myid aus der Tabelle, wo somecolumnval = 'val')

2b. Oder machen Sie die Auswahl explizit und eigenständig, und führen Sie dann die anderen Einfügungen mit diesem Wert aus.

Der Nachteil der ersten ist, dass Sie einen Proc für jeden dieser Fälle schreiben müssen. Der Nachteil der zweiten ist, dass einige db-Engines das nicht akzeptieren, und es Ihren Code verdirbt, und kann langsam sein, wenn Sie einen where für mehrere Spalten tun müssen.

Dies setzt voraus, dass es Einsätze zwischen Ihren Anrufen gibt, über die Sie keine Kontrolle haben. Wenn Sie explizite Kontrolle haben, ist eine der anderen oben genannten Lösungen wahrscheinlich besser.

Verwandte Themen