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

MySQL ON DUPLICATE KEY UPDATE only inserting, not updating

我已深入了解 SO 问题并 none 解决了我的具体问题...我已阅读以下相关主题:Here,无济于事。

我有一个简单的 table,其中包含以下数据:

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

创建语句如下:

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 的第一行。如果 contractor_idsection_idpage_id 都存在,我想做的是将其设置为 1。如果不是,请输入一个新行。

这是我的:

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 但仍然没有帮助。我在这里没有看到什么?

你离正确不远了,但你的语法有点不对。首先,如果您希望 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