我在MariaDB中创建了下表
表格创建
CREATE TABLE `email_templates_pending` (
`template_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`template_name` varchar(100) NOT NULL,
`template_data` text,
`modify_type` varchar(16) NOT NULL,
`modify_by` varchar(50) NOT NULL,
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`template_id`),
UNIQUE KEY `template_name` (`template_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
在该表中使用template_id = 1
插入一行。我想使用下面的INSERT INTO...SELECT...ON DUPLICATE KEY UPDATE
语句更新行
SQL语句
INSERT INTO email_templates_pending
(template_id, template_name, template_data, modify_by, modify_type)
SELECT template_id, template_name, template_data, 'test@test.com', 'Deleted'
FROM email_templates WHERE template_id= '1'
ON DUPLICATE KEY UPDATE modify_type='Deleted'
但是,当我运行该语句时,它返回成功,但是0 rows affected
。我有另一个类似的表,具有不同的列名称,按预期工作。我确保template_id是主键,所以我不确定问题还有什么?
答案 0 :(得分:1)
在email_templates_pending中有1行,但在email_templates中没有行。
这可能是0行受影响的原因。源表中没有行。
INSERT INTO email_templates_pending ...
SELECT ... FROM email_templates
如果您只想更新id = 1,可以使用:
INSERT INTO email_templates_pending (template_id, template_name, template_data, modify_by, modify_type)
SELECT template_id, template_name, template_data, 'test@test.com', 'Deleted' FROM email_templates_pending
ON DUPLICATE KEY UPDATE modify_type='Deleted';
如果你只需要做UPDATE,也可以直接使用UPDATE语句。
UPDATE email_templates_pending SET modify_type='Deleted' WHERE template_id= '1';
答案 1 :(得分:0)
如果ID#1已存在,且已标记为"已删除",您将正确地获得" 0行受影响"。
为了证明情况并非如此,让我们看看
的输出SELECT template_id, template_name, template_data, modify_by, modify_type
FROM email_templates WHERE template_id= '1' ;