2013-09-21 67 views
1

我有這樣的SQL這是假設如果項目不存在更新表或插入它,如果它不插不上節省重複

INSERT INTO `mlm_user_settings` (`name`, `value`,`user_id`) 
VALUES ('notify_options','opt_none','7'), 
('chk_signup','0','7'), 
('chk_activate','0','7'), 
('action','save','7'), 
('chk_acct','0','7'), 
('chk_message','0','7') 
ON DUPLICATE KEY UPDATE `value` = VALUES(`value`) 

我有index (name , user_id)

的唯一約束它不更新的值,但僅適用於新的價值觀 的插入可能是什麼問題

表架構

CREATE TABLE `mlm_user_settings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `value` varchar(200) NOT NULL, 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `user_id` (`user_id`,`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; 
+0

是表中已經存在的那些值嗎? – Mihai

+0

某些已經存在,例如,如果(name,user_id)上有一個唯一索引,則某些零將被更新爲'1' – Smith

+0

,則只有當這2列中的組合值是該值時,纔會觸發ON DUPLICATE相同 - 不是您插入的任何值的情況。 – Mihai

回答

1

您需要定義

UNIQUE KEY(name, user_id) 

簡單地定義索引不會阻止重複。您需要使用UNIQUE關鍵字。

+0

我提到ealier,我已經在那裏 – Smith

+0

@史密斯不,你說你有一個'索引' – rsanchez

+0

我的意思是一個獨特的約束 – Smith

1

http://sqlfiddle.com/#!2/7e664/1

它適用於這個小提琴檢查最後插入。

ON這些2個最後插入

('chk_message','0','7'), 
('chk_message','newvalue','7') 

約束是觸發器,因爲在2列中的值相同的「chk_message」,「7」 所以用新值來更新:0更新爲'NEWVALUE'。