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
поскольку дубликат (на обоих ключах) не найден.
как ведет себя MySQL ... Он ведет себя так, как ожидалось, то есть выполняется в предложении DUPLICATE KEY.
-
могу ли я иметь одно обновление для обоих... На самом деле у вас есть только одно предложение о дубликате ключа, поэтому вам нужно поместить некоторый код, чтобы различить, какое ограничение было задействовано. К счастью, это возможно. Единственное, что вы должны знать, порядок назначения, и вы можете назначить несколько раз. Предположим, у вас есть уникальное ограничение на a и b, и вы хотите обновить только при наличии уникальности : ... Обновление ключа c = IF(a = VALUES (a) и B VALUES(b), VALUES(c), c), b = VALUES(b)
но если вы измените порядок назначений, второе условие внутри if будет всегда ложным.
см. 2.