MySQL特殊函数使用技巧梳理
1. group_concat
使用group_concat函数,可以轻松的把分组后,name 相同的数据拼接到一起,组成一个字符串,用逗号分隔。
2. char_length
通过该函数就能获取字符长度。
3.locate
在某个字符串中的位置
4.replace
将字符串中的字符 A 替换成 B。REPLACE(name,‘A’,‘B’)
5.now
获取当前时间
6.insert into … select
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
select null,code,name,now(3) from `order` where code in ('004','005');
这样就能将 order 表中的部分数据,非常轻松插入到 brand 表中。
7.insert into … ignore
INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '苏三', now(3));
如果 brand 表中已经存在 name 为苏三的数据了,则该 sql 语句也能正常执行,并不会报错。因为它会忽略异常,返回的执行结果影响行数为 0,它不会重复插入数据。
8.select … for update
begin;
select * from `user` where id=1
for update;
//业务逻辑处理
update `user` set score=score-1 where id=1;
commit;
这样在一个事务中使用for update锁住一行记录,其他事务就不能在该事务提交之前,去更新那一行的数据。
需要注意的是 for update 前的 id 条件,必须是表的主键或者唯一索引,不然行锁可能会失效,有可能变成表锁
9.on duplicate key update
通常情况下,我们在插入数据之前,一般会先查询一下,该数据是否存在。如果不存在,则插入数据。如果已存在,则不插入数据,而直接返回结果。
在没啥并发量的场景中,这种做法是没有什么问题的。但如果插入数据的请求,有一定的并发量,这种做法就可能会产生重复的数据。
当然防止重复数据的做法很多,比如:加唯一索引、加分布式锁等。
但这些方案,都没法做到让第二次请求也更新数据,它们一般会判断已经存在就直接返回了。
这种情况可以使用on duplicate key update语法。
该语法会在插入数据之前判断,如果主键或唯一索引不存在,则插入数据。如果主键或唯一索引存在,则执行更新操作。
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '苏三', now(3))
on duplicate key update name='苏三',edit_date=now(3);
这样一条语句就能轻松搞定需求,既不会产生重复数据,也能更新最新的数据。
但需要注意的是,在高并发的场景下使用on duplicate key update语法,可能会存在死锁的问题,所以要根据实际情况酌情使用。
10.show create table
有时候,我们想快速查看某张表的字段情况,通常会使用desc命令
desc `order`;
查看索引信息
show index
我们能够看到非常完整的建表语句,表名、字段名、字段类型、字段长度、字符集、主键、索引、执行引擎等都能看到
show create table
show create table `order`;
11.create table … select
有时候,我们需要快速备份表。
通常情况下,可以分两步走:
创建一张临时表
将数据插入临时表
创建临时表
create table order_2022121819 like `order`;
将 order 表的数据插入到 order_2022121819 表中,也就是实现数据备份的功能。
insert into order_2022121819 select * from `order`;
整合上面两条命令
create table order_2022121820select * from `order`;
总结
到此这篇关于MySQL特殊函数使用技巧梳理的文章就介绍到这了,更多相关MySQL特殊函数技巧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341