如果存在,则更新MySQL更新

时间:2011-04-05 19:36:59

标签: mysql replace

我有一个每个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进行更新。如果不存在,请使用相同的值添加它。

3 个答案:

答案 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` );

然后,根据其他答案,您可以使用REPLACEON DUPLICATE进行更新。显然这是一个可怕的想法,表格的重组可能会发生,但它会起作用。