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.