我已经研究了很多问题,但没有一个解决我的具体问题...我已阅读以下相关主题: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_id
、section_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但仍然没有帮助。我在这里没有看到什么?
最佳答案
你离正确不远了,但你的语法有点不对劲。首先,如果你想要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/