[vz-dev] Letzten aktuellen Leitungswert einer uuid auslesen

Jakob Hirsch jh at plonk.de
Thu Nov 15 14:49:24 CET 2012


Sven Peitz, 15.11.2012 08:59:
> so hier mal die aktuellen Daten
> 
> CREATE TABLE `data` (
>  `id` int(11) NOT NULL AUTO_INCREMENT,
>  `channel_id` int(11) DEFAULT NULL,
>  `timestamp` bigint(20) NOT NULL,
>  `value` double NOT NULL,
>  PRIMARY KEY (`id`),
>  KEY `data_channel_id_idx` (`channel_id`),
>  CONSTRAINT `data_ibfk_1` FOREIGN KEY (`channel_id`) REFERENCES
> `entities` (`id`)
> ) ENGINE=InnoDB AUTO_INCREMENT=9394957 DEFAULT CHARSET=latin1

ok, wie vermutet kein key über channel_id+ts.

> jetzt habe ich nach Datensicherung versteht sich ein 
> ALTER TABLE data ADD UNIQUE KEY `chan_ts_idx`
> (`channel_id`,`timestamp`), DROP KEY `data_channel_id_idx`;
> 
> gemacht und bekam folgendes 
> #1062 - Duplicate entry '10-0' for key 'chan_ts_idx'

Wie gesagt, da hast du offenbar Duplikate in der Datenbank, in dem Fall
für die channel_id 10 und den timestamp 0. Da es eher unwahrscheinlich
ist, daß du am 1.1.1970 Einträge gemacht hast, sind das wohl fehlerhafte
Daten. Die kannst du mit "DELETE FROM data where channel_id=10 AND ts=0"
oder gleich mit "DELETE FROM data where ts=0" alles mit ts=0 löschen.

Um alle Duplikate zu löschen, machst du das (dauert je nach Datenmenge
aber eine Weile):

create temporary table dupes as select d2.id from data d1, data d2 where
d1.id<d2.id and d1.timestamp=d2.timestamp and d1.channel_id=d2.channel_id;

und

delete from data where id in (select id from dupes);

Für den unique key dann das ausführen:

alter table data drop key chan_ts_idx, add unique key chan_ts_idx
(channel_id, timestamp);

Der unique key ist zwar nicht zwingend notwendig, sorgt aber zumindest
für ein bisschen Daten-"Sauberkeit".



More information about the volkszaehler-dev mailing list