letzter auto_increment Wert
letzter auto_increment Wert
am 11.07.2005 12:44:16 von Carsten Wiedmann
Hallo,
um die erzeugte ID vom vorhergegangenen INSERT im aktuellen Query zu
benutzten gibt es ja zwei Möglichkeiten:
| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
| VALUES (".mysql_insert_id().", 'foo', 'bar')";
oder
| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
| VALUES (LAST_INSERT_ID(), 'foo', 'bar')";
Welche ist hier zu bevorzugen?
Gruß
Carsten
Re: letzter auto_increment Wert
am 11.07.2005 13:18:11 von Marian Heddesheimer
On 11 Jul 2005 10:44:16 GMT, Carsten Wiedmann wrote:
>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
>| VALUES (".mysql_insert_id().", 'foo', 'bar')";
>oder
>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
>| VALUES (LAST_INSERT_ID(), 'foo', 'bar')";
>
>Welche ist hier zu bevorzugen?
ich persönlich würde letzteres bevorzugen, weil ich in der Abfrage die
Abfragesprache nicht noch wechseln muss (also hier von SQL nach PHP).
Ist aber wohl eher Geschacksache.
Von der Performance dürfte das zweite auch schneller sein, weil
mysql_insert_id() eine Extra Abfrage an den DB-Server stellt. In der
Praxis wirst du aber keinen wirklich messbaren Unterschied
feststellen.
Marian
--
Barrierefreie Online-Kurse: HTML, PHP, MySQL, Word, Excel
http://www.lernpilot.de/wbt/
Re: letzter auto increment Wert
am 11.07.2005 15:17:48 von Carsten Wiedmann
Marian Heddesheimer schrieb:
> On 11 Jul 2005 10:44:16 GMT, Carsten Wiedmann wrote:
>
> >| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
> >| VALUES (".mysql_insert_id().", 'foo', 'bar')";
> >oder
> >| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
> >| VALUES (LAST_INSERT_ID(), 'foo', 'bar')";
> >
> >Welche ist hier zu bevorzugen?
>
> ich persönlich würde letzteres bevorzugen, weil ich in der Abfrage
> die Abfragesprache nicht noch wechseln muss (also hier von SQL nach
> PHP). Ist aber wohl eher Geschacksache.
Danke dir. Ich muss gestehen, dass ich, bis vorher die Frage bei uns
gestellt wurde, nicht einmal wusste das dieses auch direkt in SQL geht.
mysql_insert_id() scheint man dann also nur dann benutzen zu müssen,
wenn man zuvor den gesetzten auto increment Wert selbst festgelegt hat
oder ihn in einer Variablen für weitere INSERTS braucht. Man muss laut
PHP-Manual sonst nur noch darauf achten, welcher Spaltentyp für die ID
genommen wird.
Gruß
Carsten
Re: letzter auto_increment Wert
am 12.07.2005 12:57:30 von Helmut Schmuckermair
>>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
>>| VALUES (".mysql_insert_id().", 'foo', 'bar')";
>>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
>>| VALUES (LAST_INSERT_ID(), 'foo', 'bar')";
> ich persönlich würde letzteres bevorzugen, weil ich in der Abfrage die
> Abfragesprache nicht noch wechseln muss (also hier von SQL nach PHP).
> Ist aber wohl eher Geschacksache.
ähm, kann das funktionieren? ich dachte, mysql_insert_id() und
LAST_INSERT_ID() beziehen sich auf das unmittelbar vorangegangene insert.
ich machs jedenfalls (manchmal) anders:
1.) INSERT INTO ohne angabe eines werts für die id (muss natürlich
auto_increment sein)
2.) falls ich sie brauche -> ermittlung der id mit mysql_insert_id()
oder (fast immer) ganz anders:
verwendung der db-abstraktionsschicht adodb
(http://adodb.sourceforge.net/). hier erstellt man im ersten schritt
eine neue id, und verwendet diese dann in INSERT INTO. auto_increment
ist dann nicht notwendig.
hth
Re: letzter auto increment Wert
am 12.07.2005 13:48:59 von Marian Heddesheimer
On 11 Jul 2005 13:17:48 GMT, Carsten Wiedmann wrote:
>mysql_insert_id() scheint man dann also nur dann benutzen zu müssen,
>wenn man zuvor den gesetzten auto increment Wert selbst festgelegt hat
>oder ihn in einer Variablen für weitere INSERTS braucht. Man muss laut
>PHP-Manual sonst nur noch darauf achten, welcher Spaltentyp für die ID
>genommen wird.
siehe auch hier:
http://www.heddesheimer.de/coaching/auto_increment.html
ich hoffe, das macht es etwas klarer.
Marian
--
Barrierefreie Online-Kurse: HTML, PHP, MySQL, Word, Excel
http://www.lernpilot.de/wbt/
Re: letzter auto increment Wert
am 12.07.2005 14:05:53 von Carsten Wiedmann
Helmut Schmuckermair schrieb:
> >>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
> >>| VALUES (".mysql_insert_id().", 'foo', 'bar')";
oder <--
> >>| sql = "INSERT INTO `test` (`id`, `foo`, `bar`)
> >>| VALUES (LAST_INSERT_ID(), 'foo', 'bar')";
Hier fehlte das "oder" in deinem Zitat...
> ähm, kann das funktionieren? ich dachte, mysql_insert_id() und
> LAST_INSERT_ID() beziehen sich auf das unmittelbar vorangegangene
> insert.
.... dann ergibt das Sinn. Das unmittelbar vorhergegangene INSERT musst
du dir denken. Das oben sind dann zwei verschiedene INSERT's die auf das
Erste folgen. Nur mit dem Unterschied, dass auf verschiedene Weise auf
die erzeugte ID vom ersten INSERT zugegriffen wird. Und die Frage war,
welches dieser Zwei lässt man auf das Erste folgen.
Gruß
Carsten
Re: letzter auto increment Wert
am 12.07.2005 14:34:30 von Carsten Wiedmann
Marian Heddesheimer schrieb:
> On 11 Jul 2005 13:17:48 GMT, Carsten Wiedmann wrote:
>
> >mysql_insert_id() scheint man dann also nur dann benutzen zu müssen,
> >wenn man zuvor den gesetzten auto increment Wert selbst festgelegt
> >hat oder ihn in einer Variablen für weitere INSERTS braucht. Man
> >muss laut PHP-Manual sonst nur noch darauf achten, welcher
> >Spaltentyp für die ID genommen wird.
>
> siehe auch hier:
>
> http://www.heddesheimer.de/coaching/auto_increment.html
>
> ich hoffe, das macht es etwas klarer.
Hmm, danke, wobei ich gerade dem letzten Absatz über last_insert_id() so
nicht zustimmen würde.
IMHO enthält auch last_insert_id() nur dann einen Wert, wenn der letzte
INSERT (falls es einen gab) von mir kommt. INSERT's von anderen
Verbindungen sollten ein last_insert_id() das ich in meiner Verbindung
ausführe nicht beeinflussen.
Etwas unglücklich dürfte auch sein, dass direkt davor das gezielte
Zuweisen eines Indexwertes beschrieben wird. Genau in diesem Fall
liefert ja last_insert_id() keinen Wert, im Gegensatz zu der PHP-
Funktion mysql_insert_id() (die halt nicht mit BIGINT zurechtkommt).
Gruß
Carsten
Re: letzter auto increment Wert
am 12.07.2005 16:15:23 von Helmut Schmuckermair
> ... dann ergibt das Sinn. Das unmittelbar vorhergegangene INSERT musst
> du dir denken.
aha! dieses INSERT muss dann aber auch in eine andere tabelle gehen..
das war eine sehr wesentliche information, die ich mir nicht so einfach
denken kann..
Re: letzter auto increment Wert
am 12.07.2005 16:18:37 von Marian Heddesheimer
On 12 Jul 2005 12:34:30 GMT, Carsten Wiedmann wrote:
>Hmm, danke, wobei ich gerade dem letzten Absatz über last_insert_id() so
>nicht zustimmen würde.
>
>IMHO enthält auch last_insert_id() nur dann einen Wert, wenn der letzte
>INSERT (falls es einen gab) von mir kommt. INSERT's von anderen
>Verbindungen sollten ein last_insert_id() das ich in meiner Verbindung
>ausführe nicht beeinflussen.
Stimmt, die Funktion liefert dann 0. Das habe ich in dem Artikel
inzwischen korrigiert.
>Etwas unglücklich dürfte auch sein, dass direkt davor das gezielte
>Zuweisen eines Indexwertes beschrieben wird. Genau in diesem Fall
>liefert ja last_insert_id() keinen Wert,
Danke für den Hinweis. Ich habe meinen Text um einen entsprechenden
Hinweis ergänzt.
Marian
--
Barrierefreie Online-Kurse: HTML, PHP, MySQL, Word, Excel
http://www.lernpilot.de/wbt/
Re: letzter auto increment Wert
am 12.07.2005 16:54:18 von Carsten Wiedmann
Helmut Schmuckermair schrieb:
>
> > ... dann ergibt das Sinn. Das unmittelbar vorhergegangene INSERT
> > musst du dir denken.
>
> aha! dieses INSERT muss dann aber auch in eine andere tabelle gehen..
Wegen? Diese zwei Funktionen liefern doch einfach den autoincrement Wert
vom letzten INSERT, unabhängig davon, welche Tabelle ich dabei
angesprochen habe? (auch wenn es sich bei uns, wo die Frage aufgetaucht
ist, tatsächlich um zwei Tabellen handelt)
> das war eine sehr wesentliche information, die ich mir nicht so
> einfach denken kann..
Ach so. Ich dachte das ging aus dem einleitenden Satz hervor:
> "Carsten Wiedmann" schrieb:
>
> > um die erzeugte ID vom vorhergegangenen INSERT im aktuellen Query zu
> > benutzten gibt es ja zwei Möglichkeiten:
Gruß
Carsten