INSERT INTO .... ON DUPLICATE KEY UPDATE с разными ключами - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть 4 таблицы, одна из которых содержит все значения, которые должны быть распределены по другим 3 в зависимости от значения одного столбца.

Поэтому я хотел бы сделать INSERT ON DUPLICATE KEY UPDATE, но Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сделать тот же ключ на основной таблице, что и на других 3 таблицах.

Пример ключа на основной таблице (a, b, c, d), в то время как ключ на дочернем таблица будет (a, b, c), если я сделаю это так, будет ли работать запрос?

Я использую mysql 5.6

Я попробовал это на локальном машина, но пока я не получил никаких ошибок, я также не получил желаемого результата.

Мой запрос выглядит так

INSERT INTO table2
(a, b, c, d)
SELECT
    a, b, c, d
FROM table1 AS t
WHERE t.id <> 0
ON DUPLICATE KEY UPDATE
                     a = t.a
                     b = t.b

1 Ответ

0 голосов
/ 17 апреля 2020

Да, запрос этого шаблона будет работать, но весьма необычно, что мы будем обновлять столбцы a или b, которые являются частью УНИКАЛЬНОГО КЛЮЧА.

Когда попытка INSERT не удалась из-за нарушение уникального ограничения, часть ON DUPLICATE KEY вызывает операцию UPDATE для существующей строки.

Учитывая, что PRIMARY KEY (или UNIQUE KEY) таблицы 2 является кортежем (a,b,c), мы обычно только хотите обновить столбцы, отличные от a, b и c.

Примерно так:

 INSERT INTO table2 (a, b, c, d)

 SELECT s.a
      , s.b 
      , s.c
      , s.d
   FROM table1 s
  WHERE s.id <> 0 

 ON DUPLICATE KEY 
 UPDATE d = VALUES(d)

Это шаблон, который выполняет ожидаемые нами операции, как описано в MySQL Справочное руководство.


Если UNIQUE KEY задан как набор из трех столбцов (a, b, c), то ключ ON DUPLICATE не будет выполняться на основе значения "один столбец". ». Это срабатывает только в случае неудачной попытки выполнить INSERT с нарушением уникального ключа.


(Вопрос не в том, чтобы дать спецификацию, фактическое описание того, что является «желаемым результатом»). Поскольку вопрос поставлен, мы не можем дать никаких предложений о том, как достичь желаемого результата, мы бы только догадались.)

...