mysql插入重复的FIELD而不是KEY

时间:2011-04-26 05:42:32

标签: mysql insert duplicates field

-------------------------------------
| 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语句实现此目的?

3 个答案:

答案 0 :(得分:5)

您必须为用户名字段创建密钥,然后使用 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

答案 1 :(得分:4)

确实有,但它与您的insert声明无关。您需要在user_name列上添加唯一索引:

create unique index user_name_idx on yourtable (user_name);

然后在跟踪计数的代码中,必须决定是进行插入还是更新。

答案 2 :(得分:0)

您可以保留INSERT语句,并实现处理特殊操作的触发器。

请参阅:An Introduction To Triggers