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_id
、section_id
和 page_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_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
我已深入了解 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_id
、section_id
和 page_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_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