2017-07-28 173 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