MySQL ON DUPLICATE KEY UPDATE只插入,而不是更新

时间:2017-07-28 15:55:01

标签: mysql duplicates insert-update

我已经挖出了SO问题而没有解决我的具体问题......我已阅读以下相关主题:Here,但无济于事。

我有一个包含以下数据的简单表格:

|-----------------------------------------------------------------------------|
|  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的第一行。如果1contractor_idsection_id都存在,我想要将其设置为page_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';

这会创建一个新行。我想我不是按照预期的方式理解ON DUPLICATE KEY UPDATE的陈述。我已经阅读了MySQL文档Here但仍然没有帮助。我在这里看不到什么?

1 个答案:

答案 0 :(得分:2)

你离正确的距离不远,但你的语法有点偏。首先,如果您希望ON DUPLICATE KEY在插入contractor_idsection_idpage_id列的重复值的记录时工作,则需要对这些值进行唯一约束三列。您可以使用以下内容添加一个:

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

接下来,对于实际的INSERT语句,除了更新不需要任何更新的所有列之外,您将使用所接近的语句。相反,请保留三列,而是将modified列更新为1

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