MySQL вставить на дубликате поля вместо ключа - PullRequest
19 голосов
/ 26 апреля 2011
-------------------------------------
| user_id | user_name | user_visits |
-------------------------------------
| 1       | foo       | 5           |
-------------------------------------
| 2       | bar       | 12          |
-------------------------------------

user_id: автоинкремент, user_visits: по умолчанию 1

INSERT INTO таблица (имя_пользователя) 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_name существует, обновите user_visits, иначе вставьте новую запись.

возможно ли достичь этого с помощью одного оператора вставки?

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

Вы должны создать ключ для своего поля имени пользователя, а затем использовать 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

4 голосов
/ 26 апреля 2011

Конечно, есть, но это не имеет ничего общего с вашим утверждением insert. Вам необходимо добавить уникальный индекс в столбец user_name:

create unique index user_name_idx on yourtable (user_name);

Затем после этого в вашем коде, который отслеживает количество, нужно будет решить, делать ли вставку или обновление.

0 голосов
/ 26 апреля 2011

Вы можете оставить оператор INSERT как есть и реализовать триггер, который обрабатывает ваши специальные действия.

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

...