Mysql вставить дубликат FIELD вместо KEY
-------------------------------------
| user_id | user_name | user_visits |
-------------------------------------
| 1 | foo | 5 |
-------------------------------------
| 2 | bar | 12 |
-------------------------------------
user_id: auto increament, user_visits: по умолчанию 1
INSERT INTO table (имя_пользователя) VALUES ('baz'), ('bar'), ('qux');
вышеуказанный оператор, разумеется, вставляет 3 новые записи, в результате:
-------------------------------------
| user_id | user_name | user_visits |
-------------------------------------
| 1 | foo | 5 |
-------------------------------------
| 2 | bar | 12 |
-------------------------------------
| 3 | baz | 1 |
-------------------------------------
| 4 | bar | 1 |
-------------------------------------
| 5 | qux | 1 |
-------------------------------------
но я пытаюсь достичь:
-------------------------------------
| user_id | user_name | user_visits |
-------------------------------------
| 1 | foo | 5 |
-------------------------------------
| 2 | bar | 13 |
-------------------------------------
| 3 | baz | 1 |
-------------------------------------
| 4 | qux | 1 |
-------------------------------------
так буквально,
если поле имя_пользователя существует, обновите user_visits, иначе вставьте новую запись.
Можно ли это сделать с помощью одной инструкции insert?
Ответы
Ответ 1
Вам нужно создать ключ для поля имени пользователя, а затем использовать запрос INSERT ON DUPLICATE
для обновления значений столбцов.
Например, ваш запрос должен быть
INSERT INTO table (user_name) VALUES ('baz'), ('bar'), ('qux')
ON DUPLICATE KEY UPDATE user_visits=user_visits+1;
Для получения дополнительной справки посетите http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Ответ 2
Конечно, есть, но это не имеет никакого отношения к вашему оператору insert
. Вам нужно добавить уникальный индекс в столбец user_name
:
create unique index user_name_idx on yourtable (user_name);
Затем в вашем коде, который отслеживает счет, будет необходимо решить, следует ли делать вставку или обновление.
Ответ 3
Вы можете оставить свой оператор INSERT как есть и реализовать триггер, который обрабатывает ваши специальные действия.
Смотрите: Введение в триггеры