MySQL поведение on DUPLICATE KEY UPDATE для нескольких уникальных полей

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

2 ответов


считают

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 выполняется двумя или более записей, обновление выполняется только один раз.

Ex здесь таблица таблицы с идентификатором и именем 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

мы get

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;

что будет дай!--27-->

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

поскольку дубликат (на обоих ключах) не найден.


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

  2. могу ли я иметь одно обновление для обоих... На самом деле у вас есть только одно предложение о дубликате ключа, поэтому вам нужно поместить некоторый код, чтобы различить, какое ограничение было задействовано. К счастью, это возможно. Единственное, что вы должны знать, порядок назначения, и вы можете назначить несколько раз. Предположим, у вас есть уникальное ограничение на a и b, и вы хотите обновить только при наличии уникальности : ... Обновление ключа c = IF(a = VALUES (a) и B VALUES(b), VALUES(c), c), b = VALUES(b)

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

  3. см. 2.