我已经挖出了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
的第一行。如果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但仍然没有帮助。我在这里看不到什么?
答案 0 :(得分:2)
你离正确的距离不远,但你的语法有点偏。首先,如果您希望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