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 как есть и реализовать триггер, который обрабатывает ваши специальные действия.

Смотрите: Введение в триггеры