ubuntuusers.de

MySQL höchste ID ändern

Status: Ungelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo

ich möchte in mysql eine Abfrage um einen Wert in den zuletzt geschriebenen Datensatz zu ändern. Da ich eine automatisch hochzählende "id" habe, müsste ich ja nur den höchsten Wert her nehmen.

UPDATE tabellenname SET test='$test' WHERE max('id')

Das ist so aber nicht erlaubt. Hatjemand eine andere Idee?

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Womit machst du das? Bei PHP kannst du beispielsweise mysql-insert-id verwenden, um die ID des zuletzt hinzugefügten Datensatz zu ermitteln. Die MySQL-Konnektoren anderer Programmiersprachen haben sicherlich ähnliche Funktionen.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Ich möchte das per PHP machen. Allerdings ist das erstellen des Eintrages länger her und läuft nicht in der gleichen Umgebung. Deshalb würde ich eine mysql Lösung bevorzugen.......

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

gnude schrieb:

Ich möchte das per PHP machen. Allerdings ist das erstellen des Eintrages länger her und läuft nicht in der gleichen Umgebung. Deshalb würde ich eine mysql Lösung bevorzugen.......

Wie willst du denn dann sicher stellen, dass es wirklich der richtige Eintrag ist? Wenn in der Zwischenzeit 3 weitere Einträge hinzugekommen sind, hättest du ein Problem. Um welchen Anwendungsfall geht es denn? Eventuell gibt es eine bessere Lösung für dein eigentliches Problem.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Wohnort: Berlin

Die Besonderheiten von MYSQL kenne ich nicht, aber in klassischem SQL sähe das doch so aus:

1
2
3
UPDATE tabellenname 
  SET test='$test' 
  WHERE id=(SELECT max('id') FROM tabellenname);

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo! Du könntest auch @last_id versuchen. Ich weiß nur gerade nicht mehr, ob das MySQL war ☺

tomy1909

Anmeldungsdatum:
20. Oktober 2016

Beiträge: 3

Wie wäre es damit:

1
SELECT * FROM `table`order by id DESC limit 1 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13231

user_unknown schrieb:

1
2
3
UPDATE tabellenname 
  SET test='$test' 
  WHERE id=(SELECT max('id') FROM tabellenname);

Die einfachen Anführungsstriche um "id" sollten aber raus. Ansonsten ermittelst Du das Maximum der Zeichenkette "id", falls das überhaupt gültig ist. (Ich kann es gerade nicht ausprobieren.)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Wohnort: Berlin

rklm schrieb:

user_unknown schrieb:

1
2
3
UPDATE tabellenname 
  SET test='$test' 
  WHERE id=(SELECT max('id') FROM tabellenname);

Die einfachen Anführungsstriche um "id" sollten aber raus. Ansonsten ermittelst Du das Maximum der Zeichenkette "id", falls das überhaupt gültig ist. (Ich kann es gerade nicht ausprobieren.)

Ja, mag sein, mit dem MYSQL-Dialekt kenne ich mich nicht aus. Dann ist aber wohl auch in der Frage schon falsch?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13231

user_unknown schrieb:

rklm schrieb:

Die einfachen Anführungsstriche um "id" sollten aber raus. Ansonsten ermittelst Du das Maximum der Zeichenkette "id", falls das überhaupt gültig ist. (Ich kann es gerade nicht ausprobieren.)

Ja, mag sein, mit dem MYSQL-Dialekt kenne ich mich nicht aus.

Nee, dass einfache Anführungsstriche Zeichenkettenwerte sind, ist allgemein. Lediglich diese Backticks um Spalten- und Tabellennamen herum sind eine MySQL-Spezialität, soweit ich weiß. Wenn man DB-Objekte in exakter Grroßkleinschreibung benennen will, nimmt man normalerweise doppelte Anführungsstriche.

Dann ist aber wohl auch in der Frage schon falsch?

Jau. Hatte ich glatt übersehen, weil das Kommando generell ungültig ist. ☺

Ich habe die Tage mit einer MySQL getestet, aber noch keine elegante Lösung gefunden. Die von Dir vorgeschlagene Variante mit der Subquery in Klammern mochte er bei mir nicht. 😢

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo nochmal. lastid war wohl sqlite. In MySQL heisst das

mysql> SELECT LAST_INSERT_ID();

und gibt einen Integer zurück.

Also kann man bspw. sowas machen:

1
update tablename set fieldname="value" where id=last_insert_id();

Wichtig ist, dass last_insert_id 0 zurückgibt, wenn es kein zuletzt geändert gibt. Das sollte man bei den Abfragen berücksichtigen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13231

ChickenLipsRfun2eat schrieb:

Wichtig ist, dass last_insert_id 0 zurückgibt, wenn es kein zuletzt geändert gibt. Das sollte man bei den Abfragen berücksichtigen.

Man sollte noch viel mehr berücksichtigen, z.B. dass diese Funktion nur den korrekten Wert liefert, wenn der Max-Wert tatsächlich als letztes eingefügt wurde (und nicht z.B. ein anderer Wert oder einer in einer anderen Tabelle).

Doku

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

gnude schrieb:

ich möchte in mysql eine Abfrage um einen Wert in den zuletzt geschriebenen Datensatz zu ändern.

Daher wäre doch last_insert_id besser als der Max-Wert oder hab ich wieder nen Knoten in den Synapsen?

Antworten |