与ON DUPLICATE KEY UPDATE和键的mysql问题

时间:2013-01-09 20:09:39

标签: mysql sql

我当前的数据库表如下所示:

CREATE TABLE IF NOT EXISTS `image_ratings` (
 `rating_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `photo_id` int(11) unsigned NOT NULL DEFAULT '0',
 `rating` tinyint(3) unsigned NOT NULL DEFAULT '0',
 `rated_user_id` int(11) unsigned NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`rating_id`),
 KEY `user_id` (`user_id`),
 KEY `rated_user_id` (`rated_user_id`),
 KEY `photo_id` (`photo_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

当我这样打电话时:

INSERT INTO image_ratings (user_id, photo_id, rating, rated_user_id) VALUES (5, 5975, 8, 5973 ) ON DUPLICATE KEY UPDATE user_id=5, photo_id=5975, rating=8, rated_user_id=5973, timestamp=NOW() 

即使我已经拥有相同user_id,rated_user_id和photo_id的任何条目,它也会创建一个新条目。这是因为我为rating_id定义了一个PRIMARY键吗?

我希望它能用新的评级值更新现有条目。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

复合键上需要UNIQUE索引,用于定义您要查找的唯一元组。在您的情况下,似乎user_idphoto_id是相关的。如果没有这个,唯一的唯一键就是rating_id,每次都会自动为您填充。

另外,请不要在重要的生产数据库上使用MyISAM。与InnoDB相比,它非常脆弱,迟早会被破坏而无法修复。