2017-07-28 99 views
0

我已經挖通過SO問題,沒有解決我的具體問題...我已閱讀以下相關的線程:Here,無濟於事。MySQL在重複密鑰更新只插入,不更新

我有一個簡單的表數據如下:

|-----------------------------------------------------------------------------| 
| id | contractor_id | section_id | page_id | modified | timestamp |  
|-----------------------------------------------------------------------------| 

這裏是create語句:

CREATE TABLE `reusable_page_modified` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `contractor_id` int(11) DEFAULT NULL, 
    `section_id` int(11) DEFAULT NULL, 
    `page_id` int(11) DEFAULT NULL, 
    `modified` int(1) NOT NULL DEFAULT '1', 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=13844 DEFAULT CHARSET=utf8; 

現在我有4行的分​​貝,現在,他們是(我因爲它們是自動生成的「看着辦關ID和時間戳):

|---------------------------------------------------------| 
| contractor_id | section_id | page_id | modified | 
########################################################### 
|  1016  |  309  | 10303 |  0  | 
|---------------------------------------------------------- 
|  1017  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 
|  1073  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 
|  240  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 

我專注於第一行,其中modified設置爲0。我想要做的是將其設置爲1如果contractor_idsection_idpage_id都存在。如果不是,請輸入一個新行。

這是我有:

INSERT INTO `reusable_page_modified` 
    (contractor_id, section_id, page_id, modified) 
    VALUES ('1016', '309', '10303', '1') 
    ON DUPLICATE KEY UPDATE 
    `section_id` = '309' 
    AND `page_id` = '10303' 
    AND `contractor_id` = '1016'; 

這將創建一個新的行。我想我不瞭解它的意圖。我已閱讀MySQL文檔Here仍然沒有幫助。我在這裏沒有看到什麼?

回答

1

你不是很正確,但你的語法有點偏離。首先,如果插入contractor_idsection_idpage_id列的記錄具有重複值的記錄時,要使ON DUPLICATE KEY正常工作,則需要對這三列進行唯一性約束。您可以使用以下添加一個:

ALTER TABLE reusable_page_modified 
ADD CONSTRAINT u_cnst UNIQUE (contractor_id, section_id, page_id); 

接下來,實際INSERT聲明你會用你所擁有的是接近的,除非你更新所有不需要任何更新列。取而代之的是,先不談三列,而是更新modified1

INSERT INTO reusable_page_modified 
    (contractor_id, section_id, page_id, modified) 
VALUES ('1016', '309', '10303', '1') 
ON DUPLICATE KEY UPDATE 
    modified = 1 
+0

我知道我在想這件事有點不同比預期。現在我已經看到了'modified = 1'的意思。此外,約束條件也是有意義的......當你盯着某些東西太久時,就會覺得目光短淺!感謝您的輸入! – Zak