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

标签 mysql duplicates insert-update

我已经研究了很多问题,但没有一个解决我的具体问题...我已阅读以下相关主题:Here ,无济于事。

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

|-----------------------------------------------------------------------------|
|  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。我想要做的是将其设置为 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';

这会创建一个新行。我认为我没有按照其预期方式理解 ON DUPLICATE KEY UPDATE 语句。我已阅读MySQL文档Here但仍然没有帮助。我在这里没有看到什么?

最佳答案

你离正确不远了,但你的语法有点不对劲。首先,如果你想要ON DUPLICATE KEY当记录具有 contractor_id 的重复值时工作, section_id ,和page_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

关于MySQL ON DUPLICATE KEY UPDATE 仅插入,不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377749/

相关文章:

java - 从 LinkedList 中删除重复项,其中嵌套的集合项可以按任意顺序排列

python - 如何在大型文件系统中查找重复文件同时避免 MemoryError

mysql - 使用一个关系 ID 连接多个 MySQL 表

mysql - 平均MySQL中的某个列值

php - mysql 带条件删除查询

MySQL更新字符串集中的字符串

mysql - SQL : auto_increment of primary key counts different since I added unique keys?

mysql - SQL查询-使条件成为条件?

mysql - 数据库字段(GROUP_CONCAT)作为数组

php - 在mysql中如何使用增量i=1,i++?