MySQL-Frage: Neuesten Datensatz updaten

Gast #2003637
Moin,

wie kann ich in einer MySQL-Tabelle den (zeitlich) neuesten Eintrag 
updaten? Gibt es da eine Möglichkeit, das mit einer Abfrage 
hinzubekommen? Die betreffende Tabelle hat eine Spalte mit einem 
Zeitstempel.

Einzeln ist das klar:

Neuesten Datensatz finden: "SELECT * FROM tabelle ORDER by zeitstempel 
DESC LIMIT 1"

Datensatz ändern: "UPDATE tabelle SET spalte=wert WHERE ...?!"

Aber wie bekomme ich beides in eine Abfrage?
Gast #2003656
Geht leider nicht:

Probiert habe ich:

"UPDATE status_log SET zeit=now() where zeit = (select zeit from 
status_log order by zeit desc limit 1)"

Ergebnis:

#1093 - Die Verwendung der zu aktualisierenden Zieltabelle 'status_log' 
ist in der FROM-Klausel nicht zulässig.
Gast #2003659
schade - das ist mysql scheinbar noch nicht so weit. (MS-SQL kann das).

du solltst aber wenn es denn gehen würde lieber Max und nicht limit 
verwenden. Max sollte etwas schnell sein.
Gast #2003693
:)

direkt aus dem "MySQL Reference Manual for version 4.0.22":
1
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
2
    SET col_name1=expr1 [, col_name2=expr2 ...]
3
    [WHERE where_definition]
4
    [ORDER BY ...]
5
    [LIMIT row_count]
#2005639
Ich persönlich würde das anders lösen.

Die Tabelle status_log bekommt eine Spalte status_log_id als PrimaryKey.
Die Spalte ist dann integer oder größer.

Beim Insert kann dann die DB-Engine (autoidentity) selbst oder du in 
einer StoredProcedure diesen Wert inkrementieren und schreiben.

Auf diese Spalte wird auch der Hauptindex der Tabelle gelegt.

Beim Update auf den jüngsten Datensatz würde ich dann einen NestedSelect 
verwenden:
UPDATE bla bla WHERE Zeitstempel IN ( SELECT MAX(Zeitstempel)....)

Vorteil: Beim NestedSelect wird auf jeden Fall der Index verwendet und 
das ganze geht entsprechend schnell.

Bei dem internen ORDER BY & LIMIT und sehr großen Tabellen kann es sonst 
irgendwann knirschen und du musst dich mit den internen Zugriffsplänen 
rumschlagen.

HTH
Stefan
Gast #2005916
Stefan W. schrieb:
> UPDATE bla bla WHERE Zeitstempel IN ( SELECT MAX(Zeitstempel)....)

die Idee war ja schon da, myssql kann scheinbar nicht das update und 
select gleichzeitg auf die gleiche Tabelle.

> #1093 - Die Verwendung der zu aktualisierenden Zieltabelle 'status_log'
> ist in der FROM-Klausel nicht zulässig
Gast #2006282
LAST_INSERT_ID() nutzt hier garnichts, der als letztes eingefügte 
Datensatz muß ja nicht unbeding der "zeitlich neueste Eintrag" sein. Es 
gibt schließlich auch noch UPDAE Statements.
Persönliche Seite #2006379
Man könnte natürlich auch einfach das ganze in eine Transaktion packen 
und in zwei Querys aufsplitten...

Was aber geht:
1
create view workaround as SELECT id as timeid from time_update order by time desc limit 1;
1
UPDATE time_update SET wert='hallo' WHERE id = (SELECT timeid FROM workaround);

Wie zuverlässig das ist oder ob es ggf. Seiteneffekte gibt weiß ich 
natürlich nicht.

Tabelle:
1
CREATE TABLE  `test`.`time_update` (
2
  `id` int(11) NOT NULL,
3
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
4
  `wert` varchar(200) NOT NULL,
5
  PRIMARY KEY (`id`)
6
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.