update语句 mysql插入重复FIELD而不是KEY




on duplicate key update死锁 (3)

您必须为您的用户名字段创建一个键,然后使用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

-------------------------------------
| user_id | user_name | user_visits |
-------------------------------------
| 1       | foo       | 5           |
-------------------------------------
| 2       | bar       | 12          |
-------------------------------------

user_id:自动增量,user_visits:默认值1

INSERT INTO table(user_name)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,否则插入新记录。

是否有可能通过单个插入语句来实现?


当然有,但与insert语句无关。 您需要在user_name列中添加一个唯一的索引:

create unique index user_name_idx on yourtable (user_name);

然后在你的代码跟踪计数将不得不决定是否插入或更新。


你可以保持你的INSERT语句不变,并实现一个触发器来处理你的特殊操作。

请参阅: 触发器简介





field