Problem bei ON DUPLICATE KEY UPDATE

Problem bei ON DUPLICATE KEY UPDATE

am 03.08.2007 06:50:19 von Andreas Born

Hi,

ich habe hier ein Problem aus dem ich nicht schlau werde. Und zwar geht
es um die Konsolidierung einer Quell-Tabelle in eine Ziel-Tabelle.
Wesentlich vereinfacht sehen die Tabellen so aus:

quelle: key - timestamp - count
ziel: key - tsLastUpdate - tsOldestEntry - totalCount

Die Daten übertrage ich mit dieser SQL-Anweisung:

INSERT DELAYED INTO `target` (
`key`,`tsLastUpdate`,`tsOldestEntry`,`totalCount`
) VALUES (....)
ON DUPLICATE KEY UPDATE
`tsLastUpdate`=IF(`tsLastUpdate` VALUES(`timestamp`),
`tsLastUpdate`),
`tsOldestEntry`=IF(`tsOldestEntry`>VALUES(`timestamp`),
VALUES(`timestamp`),
`tsOldestEntry`),
`cntTotal`=`cntTotal`+VALUES(`count`)


VALUES(...) enthält die zu 'mergenden' Datensätze (ziemlich viele).


Die Tabellendefinition sieht so aus:

CREATE TABLE `target` (
`key` varchar(255) character set utf8 NOT NULL default '',
`tsLastUpdate` timestamp NOT NULL default CURRENT_TIMESTAMP
on update CURRENT_TIMESTAMP,
`tsOldestEntry` timestamp NOT NULL default '0000-00-00 00:00:00'
`totalCnt` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`key`),
KEY `tsLastUpdate` (`tsLastUpdate`),
KEY `tsOldestEntry` (`tsOldestEntry`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1


tsOldestEntry sollte jetzt eigentlich den kleinsten Timestamp für den
jeweiligen key-Datensatz enthalten, alle weiteren updates sollen nur den
Wert tsLastUpdate aktualisieren, sowie count aufsummieren. Doch
tsOldestEntry wird regelmäßig geändert, und ist teilweise sogar größer
als tsLastUpdate. Nur wie kann tsOldestEntry bei obigem Statement
überhaupt anwachsen?

In den Quelldaten kommen häufig mehrere Datensätze mit gleichem key aber
unterschiedlichen timestamps vor, die eingepflegt werden sollen.
tsOldestEntry soll immer den jeweils kleinsten vorkommenden timestamp
wiedergeben.

Hab ich evtl. irgendeinen Fehler gemacht, funktioniert '>' nicht mit
timestamps, oder gibt es irgendwas anderes zu beachten? Bin leider
ziemlich ratlos...


Viele Grüße,
Andreas