我有一个每个channel_id的归档值表,但我也希望保持每个channel_id的当前值。我首先尝试将它放在一个单独的表中,但是对于每个选择查询在表上使用联合是不可能的慢(我查看了两个表的并集)。
所以我想最好的选择是将它保存在存档数据表中,还有一个额外的列来指示它是否是当前值?
我的问题是,如果一行不存在且相同的channel_id和当前列等于1,如何将当前值添加到该表,如果它存在则更新它?
我看不到一种方法来创建一个引用channel_id和current的唯一索引,因为很多channel_ids都有current = 0.所以replace不起作用。并且更新并不总是有效,因为该行可能尚不存在。
有更好的解决方案吗?该表将有数百万条目,并且将有数十万个channel_ids。
修改
CREATE TABLE `data` (
`date_time` decimal(26,6) NOT NULL,
`channel_id` mediumint(8) unsigned NOT NULL,
`value` varchar(40) DEFAULT NULL,
`status` tinyint(3) unsigned DEFAULT NULL,
`connected` tinyint(1) unsigned NOT NULL,
`current` tinyint(1) unsigned DEFAULT NULL,
PRIMARY KEY (`channel_id`,`date_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `current` (
`date_time` decimal(26,6) NOT NULL,
`channel_id` mediumint(8) unsigned NOT NULL,
`value` varchar(40) DEFAULT NULL,
`status` tinyint(3) unsigned DEFAULT NULL,
`connected` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`channel_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这些是我目前正在处理的表格。我想要找到一种很好的方法来将这些用于查询(在这种情况下,不需要数据表中的当前列),或者只使用数据表,对于给定的channel_id,找到具有当前的channel_id的一行= 1并且如果存在,则使用新的date_time,value,status和connected进行更新。如果不存在,请使用相同的值添加它。
答案 0 :(得分:3)
查看MySQL ON DUPLICATE KEY UPDATE语法
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
答案 1 :(得分:1)
答案 2 :(得分:0)
您绝对可以创建复合UNIQUE
密钥。
CREATE UNIQUE INDEX ON table_name ( `channel_id`, `current` );
然后,根据其他答案,您可以使用REPLACE
或ON DUPLICATE
进行更新。显然这是一个可怕的想法,表格的重组可能会发生,但它会起作用。