last_insert_id
sodiac
- datenbank
hallo leute!
nach langem herum basteln habe ich es endlich geschafft das der letzte eintrag nochmal der wert im feld 2 geändert wird
insert into tabelle set feld1 = 'mein wert';
update table set feld2 = LAST_INSERT_ID() where id = LAST_INSERT_ID();
jetzt möchte ich aber dem feld2 nicht nur die id zuweisen sondern auch noch eigene werte.
z.B.
update table set feld2 = LAST_INSERT_ID()&'S052009' where id = LAST_INSERT_ID()
aber es funzt einfach nicht. kann mir da jemand weiter helfen?
danke im vorraus
sodiac
Verketten geht mit CONCAT
CONCAT( LAST_INSERT_ID() ,'S052009' )
Verketten geht mit CONCAT
CONCAT( LAST_INSERT_ID() ,'S052009' )
super vielen dank. es jeit. wundobor. :D :D :D
kurze frage am rande.
wie sicher ist diese abfrage wenn mehrere benutzer auf der datenbank ihre daten eingeben? kann es da zu konflikten kommen? bzw verfälschte daten?
danke sodiac
Am besten alles aufeinmal mit mysqli::multi_query( 'SQL1; SQL2' ) ausführen
und es sollte keine Probleme geben ...
Grüße Flow
Am besten alles aufeinmal mit mysqli::multi_query( 'SQL1; SQL2' ) ausführen
und es sollte keine Probleme geben ...Grüße Flow
danke. werd gleich mal meine quellcodes ändern. :)
gruß sodiac
Hello,
Am besten alles aufeinmal mit mysqli::multi_query( 'SQL1; SQL2' ) ausführen
und es sollte keine Probleme geben ...
Wieso sollte es da keine Probleme mehr geben, wenn es anders welche gab?
Wird ein Multiquery neuerdings automatisch atomar gebunden?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
»» Am besten alles aufeinmal mit mysqli::multi_query( 'SQL1; SQL2' ) ausführen
»» und es sollte keine Probleme geben ...Wieso sollte es da keine Probleme mehr geben, wenn es anders welche gab?
Wird ein Multiquery neuerdings automatisch atomar gebunden?Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
also könnte es doch zu problemen kommen?
Hi,
also könnte es doch zu problemen kommen?
<drohung> Wenn du weiterhin so unsinnig zitierst - Ja. </drohung>
Davon abgesehen, LAST_INSERT_ID() ist an die Datenbankverbindung gebunden.
MfG ChrisB
Hello,
also könnte es doch zu problemen kommen?
<drohung> Wenn du weiterhin so unsinnig zitierst - Ja. </drohung>
*hihi* habe ich ihm gerade geschreieben :-)
Davon abgesehen, LAST_INSERT_ID() ist an die Datenbankverbindung gebunden.
Das erledigt zwar das Problem, über das sodiac nachgedacht hat, aber nicht das Problem, über das sidiac nicht nachgedacht hat. Es könnte sich ein TOCTOU-Problem (Race Condition zwischen zwei nebenläufigen Prozessen) ergeben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
<drohung> Wenn du weiterhin so unsinnig zitierst - Ja. </drohung>
was ist denn jetzt los. ich steh gerade aufm schlauch.
Hello,
also könnte es doch zu problemen kommen?
Woher soll ich das wissen, ewnn Du dein Vorhaben nicht etwas klarer formulierst?
Bitte nochmal genauer beschreiben, um welche Tabellen es geht und welche Spalten darin betroffen sind und wie die nun zusammenhängen sollen, also die relationen zwischen den Tabellen klarer definieren.
Und bitte in Zukunft kein TOFU oder TUFO mehr http://de.wikipedia.org/wiki/TOFU
Es reicht, die relevanten Zeilen zu wiederholen und dann darunter deine Antwort zu setzen :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
danke nochmal für den denkanstos habe dafür eine ander lösung gefunden.
ich nehme die session_id als wieder erkennung des eintrages und geb somit dem feld zwei die id und meinen wert mit. leere im gleichen zug den eintrag mit der session_id.
es ging darum das eine vertragsnummer vorhanden sein soll. die so aufgebaut ist. id/SMMYYYY.
wenn es aber eine elegantere lösung gibt bin ich dafür immer offen.
Hi,
es ging darum das eine vertragsnummer vorhanden sein soll. die so aufgebaut ist. id/SMMYYYY.
Und warum speicherst du im zweiten Feld dann nicht nur noch den SMMYYYY-Part - wenn du die ID doch schon in einem anderen Feld stehen hast?
Welchen Vorteil versprichst du dir davon, den ID-Wert redundant vorzuhalten?
MfG ChrisB
Und warum speicherst du im zweiten Feld dann nicht nur noch den SMMYYYY-Part - wenn du die ID doch schon in einem anderen Feld stehen hast?
das wollte ich ja so machen. aber aus gesetzlichen gründen des datennachweis beim finanzamt um steuerberater muss der erkennende wert für verträge und oder rechnung zusammenhängend gespeichert nieder geschrieben sein.
daher der umständliche weg.
Hi,
das wollte ich ja so machen. aber aus gesetzlichen gründen des datennachweis beim finanzamt um steuerberater muss der erkennende wert für verträge und oder rechnung zusammenhängend gespeichert nieder geschrieben sein.
die Spalten eines Datensatzes hängen durchaus zusammen.
Cheatah
die Spalten eines Datensatzes hängen durchaus zusammen.
das ist ja aus unserer sicht durchaus richtig. da gebe ich dir voll und ganz recht.
doch in der vergangenheit hatte ich aus genau diesem grund probleme bekommen.
mein weg war bisher das ich ein insert machte dann folgte daten aus der datenbank holen und ein update machen.
eigentlich mach ich jetzt auch nichts anderes.
ich wollte eigentlich einen einfachen und eleganteren weg finden.
Hello,
ich wollte eigentlich einen einfachen und eleganteren weg finden.
Bei einigen Datenbanksystemen gibt es auch die "next_insert_id".
Z.B. ist die bei MySQL auch verfügbar.
Dort heißt sie aber nur "insert_id"
http://dev.mysql.com/doc/refman/5.1/en/server-session-variables.html#sysvar_insert_id
Auf diese kannst Du sofort im Statement zugreifen, wenn Du Redundanz benötigst.
Damit würde das Statement dann vermutlich auch atomar...
...wobei ChrisB dir ja auch schon gesagt hat, dass die last_insert_id pro Connection gilt und damit auch keine Probleme bereite würde.
Die next_insert_id gilt pro Tabelle und NICHT pro Connection. Deshalb darf man darauf (für Deine Zwecke) auch nur _innerhalb_ _eines_ Statements zugreifen, da das von der DB immer atomar abgewickelt wird, also sie nicht erst auslesen mit einem Statement und mit einem anderen dann benutzen. Das würde zu einem TOCTOU-Problem führen http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
insert into tabelle set feld1 = 'mein wert';
update table set feld2 = LAST_INSERT_ID() where id = LAST_INSERT_ID();
>
> jetzt möchte ich aber dem feld2 nicht nur die id zuweisen sondern auch noch eigene werte.
>
> z.B.
> `update table set feld2 = LAST_INSERT_ID()&'S052009' where id = LAST_INSERT_ID()`{:.language-sql}
Leider werde ich aus Deinem Pseudocode nicht schlau.
Handelt es sich um zwei unterschiedliche Tabellen?
Kannst Du das bitte nochmal etwas genauer beschreiben, was Du willst.
Vielleicht hat Flow indirekt schon recht, dass es da Probleme geben könnte.
Allerdings ist sein Lösungsansatz mMn nicht der richtige.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>