MySQL-Frage: Neuesten Datensatz updaten

Gast #2003637
Lesenswert?

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
Lesenswert?

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 #2003693
Lesenswert?

:)

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
Lesenswert?

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
Lesenswert?

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
Persönliche Seite #2006379
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren