2016-07-19 2 views
1

Есть ли разница между этими двумя? Я работаю над некоторым кодом, который, кажется, использует их взаимозаменяемо, и быстрый тест показывает мне, что они, похоже, делают то же самое.ON DUPLICATE KEY UPDATE a = ЗНАЧЕНИЯ (b) против a = b

INSERT INTO... 
... 
ON DUPLICATE KEY UPDATE a=VALUES(b) 

против

INSERT INTO... 
... 
ON DUPLICATE KEY UPDATE a=b 

ответ

2

Да. они разные. Предположим, что это обновит строку, где b=100.

1. INSERT INTO foo SET a='42', b='69' ON DUP ... SET a=b 
2. INSERT INTO foo SET a='42', b='69' ON DUP ... SET a=VALUES(b) 

(1) обновит строку и a станет 100, потому что это значение в настоящее время в b поле для этой записи.

(2) обновит строку и a станет 69, потому что это значение можно найти в списке поля/значения самого обновления запроса, независимо от значения в b уже в записи.

b само по себе является полем в уже сохраненной записи, VALUES(b) - это значение, которое поле будет обновлено до, если ошибка повторялась не была.

+0

Запросы должны быть 'INSERT', а не' UPDATE'. – Barmar

+0

woops. правый .. спасибо. –

1

a = VALUES(b) означает, что новое значение, которое было бы вставлено в столбец b, если бы не было дублирующего ключа, и назначить его столбцу a при обновлении строки.

a = b предназначено для копирования старого значения столбца b в столбец a в строке, содержащей дубликат ключа.

Смежные вопросы