Поведение MySQL в ON DUPLICATE KEY UPDATE для нескольких полей UNIQUE - программирование
Подтвердить что ты не робот

Поведение MySQL в ON DUPLICATE KEY UPDATE для нескольких полей UNIQUE

Начиная с MySQL 4.1.0, можно добавить инструкцию ON DUPLICATE KEY UPDATE для указания поведения, когда значения, вставленные (с INSERT или SET или VALUES), уже находятся в таблице назначения w.r.t. PRIMARY KEY или в поле UNIQUE. Если значение для PRIMARY KEY или некоторого поля UNIQUE уже находится в таблице, INSERT заменяется на UPDATE.

  • Как работает ON DUPLICATE KEY UPDATE, если есть несколько UNIQUE в моей таблице?

  • Могу ли я иметь только одно обновление, только если соответствует поле UNIQUE?

  • Можно ли обновить только в том случае, если оба поля UNIQUE совпадают одновременно?

4b9b3361

Ответ 1

Рассмотрим

INSERT INTO table (a,b,c) VALUES (1,2,3)
    -> ON DUPLICATE KEY UPDATE c=c+1;

если a и b являются полями UNIQUE, UPDATE происходит на a = 1 OR b = 2. Также, когда условие a = 1 OR b = 2 выполняется двумя или более записями, обновление выполняется только один раз.

В следующей таблице таблицы с полями Id и Name UNIQUE

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6

Если запрос

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)

то получим

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

что нарушает уникальность Id и Name. Теперь с

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7

получаем

Id     Name     Value 
1      P        7 
2      C        7 
3      D        29 
4      A        6

Поведение на нескольких ключах - это

UPDATE в ON DUPLICATE KEY UPDATE выполняется, если одно из полей UNIQUE равно значению, которое нужно вставить. Здесь UPDATE выполняется на Id = 1 OR Name = C. Это эквивалентно

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C

Что делать, если я хочу только одно обновление, для любой клавиши

Может использовать оператор UPDATE с ключевым словом LIMIT

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;

который даст

Id     Name     Value 
1      P        7 
2      C        3 
3      D        29 
4      A        6

Что делать, если я хочу одно обновление, только если значения для обоих ключей совпадают

Одно из решений - ALTER TABLE и сделать PRIMARY KEY (или уникальность) работать в обоих полях.

ALTER TABLE table 
DROP PRIMARY KEY
ADD PRIMARY KEY (Id, Name);

Теперь, на

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7

получаем

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

так как не найден дубликат (по обеим клавишам).

Ответ 2

  • как работает MySQL... Он ведет себя так, как ожидалось, то есть выполняет предложение ON DUPLICATE KEY.

  • Могу ли я получить одно обновление для... На самом деле у вас есть только одно предложение ON DUPLICATE KEY, поэтому вам нужно поместить некоторый код, чтобы отличить, какое ограничение было задействовано. Вполне возможно, это возможно. Единственное, что вы должны знать, имеет порядок назначения, и вы можете назначить несколько раз. Предположим, у вас есть уникальное ограничение на a и b, и вы хотите обновить c только в том случае, если речь идет о уникальности:   ...   KEY UPDATE c = IF (a = VALUES (a) и b < > VALUES (b), VALUES (c), c), b = VALUES (b)

    но если вы измените порядок назначений, второе условие внутри if будет всегда ложным.

  • См. 2.