UPON DUPLICATE KEY увеличить несколько столбцов? - PullRequest
0 голосов
/ 06 марта 2012

Я запускаю журнал базы данных, и каждый день я вхожу в новую строку. Поэтому мой запрос Mysql проверяет, существует ли уже день (дата (уникальный ключ)), и, если это так, он пытается увеличить все регистрируемые значения строки журнала на единицу. Если запись даты еще не видна, будет создана новая строка.

Мой SQL-запрос:

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1
WHERE `date`='2012-03-06';"

Все столбцы имеют значение по умолчанию 0, поэтому, если этот запрос выполняется сразу после полуночи, только «устаревшие» и «совпадения» устанавливаются на 1. В противном случае значения «устаревшие» и «совпадения» увеличиваются.

Желаю! (это не работает).

Чего мне не хватает? Какой разделитель, кроме запятой, следует использовать между 'hit' = 'hit' + 1 и 'stale' = 'stale' + 1 ?

Ответы [ 4 ]

1 голос
/ 06 марта 2012

Ваш разделитель правильный, но ОБНОВЛЕНИЕ уже обнаружило, что дублирующаяся строка способна вызвать КЛЮЧ НА ДУБЛИКАТЕ, поэтому вам не нужно пытаться выбрать его снова, используя ГДЕ.

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1

Демо здесь .

1 голос
/ 06 марта 2012

Просто избавьтесь от предложения WHERE:

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1;
0 голосов
/ 07 марта 2012

Если вы хотите выполнить обновление, только если какое-то конкретное выражение является истинным, вы можете сделать это с помощью двух операторов:

INSERT IGNORE INTO x VALUES (.....);
UPDATE x SET ..... WHERE .....;

INSERT автоматически завершится ошибкой при наличии дублирующего ключа.

0 голосов
/ 06 марта 2012

Вы не должны иметь предложение WHERE. ON DUPLICATE KEY UPDATE автоматически ограничивает строку, на которую он влияет, той, которая имеет существующий ключ.

Удалите его, и ваш запрос должен работать нормально.

...