MySQL-mysql判断某记录是否存在,如果存在则更新,如果不存在则更新时间最旧的一条
查找是否有user_id=10的记录
如果存在:则更新USER_ID=10的tag_text和时间
如果不存在:则更新search_time最早的一条记录的tag_text和search_time
如何一次数据库请求就能完成呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果你有唯一约束的时候可以用 on duplicate key。如:
insert into table(field1) values('xxx') on duplicate key update field1 = 'xxx'
好了,搞定了!
《高性能mysql》里有个例子: Writing a lazy UNION,我觉得可以用过来(不过麻烦好多啊,唉)。
SQL如下:
update table1 T1 join
(select * from (select id from table1
where @found is null order by search_time limit 1) tmp
union all
select * from (select GREATEST(@found := -1, id) AS id
from table1 where user_id=10) tmp1
union all
select 1 from dual where ( @found := null ) is not null
) T2
on T1.id=T2.id
set T1.tag_text='updated', T1.search_time=now();
稍微解释一下:
因为union和order by不能同时用,所以嵌套了一层子查询。同时调整了 第一个union前后的两条语句(因为子查询会先进行)。
运行结果如下,完全符合楼主的要求:
mysql> select * from table1;
+------+---------+----------+---------------------+
| id | user_id | tag_text | search_time |
+------+---------+----------+---------------------+
| 1 | 3 | dfd | 2013-05-29 23:15:03 |
| 3 | 100 | dfd | 2013-05-29 23:16:25 |
| 2 | 10 | dfd | 2013-05-29 23:16:25 |
+------+---------+----------+---------------------+
3 rows in set (0.00 sec)
//运行我写的SQL
。。。
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from table1;
+------+---------+----------+---------------------+
| id | user_id | tag_text | search_time |
+------+---------+----------+---------------------+
| 1 | 3 | dfd | 2013-05-29 23:15:03 |
| 3 | 100 | dfd | 2013-05-29 23:16:25 |
| 2 | 10 | updated | 2013-05-29 23:17:41 |
+------+---------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> delete from table1 where user_id=10;
Query OK, 1 row affected (0.00 sec)
mysql> select * from table1;
+------+---------+----------+---------------------+
| id | user_id | tag_text | search_time |
+------+---------+----------+---------------------+
| 1 | 3 | dfd | 2013-05-29 23:15:03 |
| 3 | 100 | dfd | 2013-05-29 23:16:25 |
+------+---------+----------+---------------------+
2 rows in set (0.00 sec)
//运行我写的SQL
。。。
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from table1;
+------+---------+----------+---------------------+
| id | user_id | tag_text | search_time |
+------+---------+----------+---------------------+
| 1 | 3 | updated | 2013-05-29 23:19:05 |
| 3 | 100 | dfd | 2013-05-29 23:16:25 |
+------+---------+----------+---------------------+
2 rows in set (0.00 sec)
一次请求不是很合理
可以直接update ... where user_id = 10
update如果返回值大于0说明有更新,那你再最新的记录好了
两次请求搞定
个人觉得这些逻辑应该是在高级语言层完成了,让数据库做它擅长的事情,而不是做逻辑判断什么的
有专门的sql命令的。replace into 你搜索下网上都有,语法格式类似insert into
replace into
这个貌似不可以一次请求吧,首先你要查询到user_id是否有10的记录,这就是一场查询,然后判断更新。