MySQL: расширенная вставка, если не существует - PullRequest
1 голос
/ 25 августа 2011

У меня есть таблица с тремя столбцами: user_id, setting и value. Я пытаюсь использовать следующий код:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 500)
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1'

Это прекрасно работает при создании новой настройки и не создает дублирующихся записей. Проблема возникает, когда я хочу изменить значение - это не сработает после выполнения предыдущего запроса:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 999)
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1'

Строки не затрагиваются. Я явно что-то упускаю ...

ВАЖНО : Я не могу изменить базу данных (новые первичные ключи или что-то в этом роде).

ОБНОВЛЕНИЕ : Кажется, мое понимание ON DUPLICATE KEY неверно. Но остается вопрос: как наиболее эффективно это сделать?

Ответ на комментарий ниже : «Если первичный (или уникальный) ключ (user_id, setting), то используйте: ... ON DUPLICATE KEY UPDATE значение = 999".

1 Ответ

2 голосов
/ 25 августа 2011

Предполагая, что на самом деле у вас есть уникальный ключ на user_id, вы получаете "не затронуты строки", потому что вы ничего не меняете во втором запросе. Я думаю, что вы хотите обновить также поле value:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 999)
ON DUPLICATE KEY UPDATE setting = setting_1,value=999

Без value вы просто устанавливаете поля user_id и setting на те же значения, что и раньше, и MySQL не нужно обновлять запись.

Если у вас нет уникального ключа на user_id, вам придется найти другой подход, так как ON DUPLICATE KEY UPDATE не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...