2016-03-10 2 views
1

Я создал следующую таблицу в MariaDBMariaDB INSERT INTO ... SELECT ... дублирование KEY UPDATE, затрагивающий 0 строк

создание Таблицы

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, '[email protected]', 'Deleted' 
     FROM email_templates WHERE template_id= '1' 
ON DUPLICATE KEY UPDATE modify_type='Deleted' 

Однако, когда я запускаю заявление возвращается успешно, но с 0 rows affected. У меня есть другая подобная таблица с разными именами столбцов, которая работает по назначению. Я гарантировал, что template_id является основным ключом, поэтому я не уверен, что еще может быть проблемой?

ответ

1

У вас есть 1 строка в email_templates_pending, но нет строк в email_templates.

Возможно, это причина, по которой затронута строка 0. В исходной таблице нет строки.

INSERT INTO email_templates_pending ... 
SELECT ... FROM email_templates 

Если вы просто хотите обновить для ид = 1, вы можете использовать это:

INSERT INTO email_templates_pending (template_id, template_name, template_data, modify_by, modify_type) 
SELECT template_id, template_name, template_data, '[email protected]', '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'; 
+0

Можно ли обновить синтаксис, так что не полагается на столе email_templates? – Jester

+0

Почему бы просто не использовать ОБНОВЛЕНИЕ? @Jester –

+0

Способ архивирования кода на самом деле требует захвата значения из таблицы email_template, если он не существует в таблице email_template_pending. Вы предлагаете запустить второй оператор UPDATE после INSERT SELECT? – Jester

0

Если идентификатор # 1 существует и уже был отмечен как «Удаленные», вы бы правильно получить «0 затронутых строк».

Чтобы доказать, что это не так, давайте посмотрим на выход из

SELECT template_id, template_name, template_data, modify_by, modify_type 
    FROM email_templates WHERE template_id= '1' ; 
Смежные вопросы