------------------------------------- | 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语句实现此目的?
答案 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语句,并实现处理特殊操作的触发器。