2013-01-09 261 views
0

我現在的數據庫表看起來是這樣的:MySQL的問題與對重複密鑰更新和密鑰

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

您需要在複合鍵上有一個UNIQUE索引,它定義了您要查找的唯一元組。在你的情況下,似乎user_idphoto_id將是相關的。如果沒有這個,唯一的唯一關鍵是rating_id,每次都會自動爲你填充。

此外,請不要在重要的生產數據庫上使用MyISAM。與InnoDB相比,它非常脆弱,並且遲早會變得無法修復。

+0

感謝您的反饋意見。任何想到SQL會是什麼樣子? MySQL對我仍然有點粗糙。我也一定會把它改成InnoDB – Paul

+0

就像你說的那樣,它是我需要的唯一元組(0123)user_id,rated_user_id,photo_id – Paul

+0

這是我試過的:ALTER TABLE image_ratings ADD UNIQUE INDEX(user_id,photo_id,rated_user_id); – Paul