1. group_concat
使用group_concat函數(shù),可以輕松的把分組后,name 相同的數(shù)據(jù)拼接到一起,組成一個(gè)字符串,用逗號(hào)分隔。
2. char_length
通過(guò)該函數(shù)就能獲取字符長(zhǎng)度。
3.locate
在某個(gè)字符串中的位置
4.replace
將字符串中的字符 A 替換成 B。REPLACE(name,‘A’,‘B’)
5.now
獲取當(dāng)前時(shí)間
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 表中的部分?jǐn)?shù)據(jù),非常輕松插入到 brand 表中。
7.insert into … ignore
INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '蘇三', now(3));
如果 brand 表中已經(jīng)存在 name 為蘇三的數(shù)據(jù)了,則該 sql 語(yǔ)句也能正常執(zhí)行,并不會(huì)報(bào)錯(cuò)。因?yàn)樗鼤?huì)忽略異常,返回的執(zhí)行結(jié)果影響行數(shù)為 0,它不會(huì)重復(fù)插入數(shù)據(jù)。
8.select … for update
begin;
select * from `user` where id=1
for update;
//業(yè)務(wù)邏輯處理
update `user` set score=score-1 where id=1;
commit;
這樣在一個(gè)事務(wù)中使用for update鎖住一行記錄,其他事務(wù)就不能在該事務(wù)提交之前,去更新那一行的數(shù)據(jù)。
需要注意的是 for update 前的 id 條件,必須是表的主鍵或者唯一索引,不然行鎖可能會(huì)失效,有可能變成表鎖
9.on duplicate key update
通常情況下,我們?cè)诓迦霐?shù)據(jù)之前,一般會(huì)先查詢(xún)一下,該數(shù)據(jù)是否存在。如果不存在,則插入數(shù)據(jù)。如果已存在,則不插入數(shù)據(jù),而直接返回結(jié)果。
在沒(méi)啥并發(fā)量的場(chǎng)景中,這種做法是沒(méi)有什么問(wèn)題的。但如果插入數(shù)據(jù)的請(qǐng)求,有一定的并發(fā)量,這種做法就可能會(huì)產(chǎn)生重復(fù)的數(shù)據(jù)。
當(dāng)然防止重復(fù)數(shù)據(jù)的做法很多,比如:加唯一索引、加分布式鎖等。
但這些方案,都沒(méi)法做到讓第二次請(qǐng)求也更新數(shù)據(jù),它們一般會(huì)判斷已經(jīng)存在就直接返回了。
這種情況可以使用on duplicate key update語(yǔ)法。
該語(yǔ)法會(huì)在插入數(shù)據(jù)之前判斷,如果主鍵或唯一索引不存在,則插入數(shù)據(jù)。如果主鍵或唯一索引存在,則執(zhí)行更新操作。
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '蘇三', now(3))
on duplicate key update name='蘇三',edit_date=now(3);
這樣一條語(yǔ)句就能輕松搞定需求,既不會(huì)產(chǎn)生重復(fù)數(shù)據(jù),也能更新最新的數(shù)據(jù)。
但需要注意的是,在高并發(fā)的場(chǎng)景下使用on duplicate key update語(yǔ)法,可能會(huì)存在死鎖的問(wèn)題,所以要根據(jù)實(shí)際情況酌情使用。
10.show create table
有時(shí)候,我們想快速查看某張表的字段情況,通常會(huì)使用desc命令
desc `order`;
查看索引信息
show index
我們能夠看到非常完整的建表語(yǔ)句,表名、字段名、字段類(lèi)型、字段長(zhǎng)度、字符集、主鍵、索引、執(zhí)行引擎等都能看到
show create table
show create table `order`;
11.create table … select
有時(shí)候,我們需要快速備份表。
通常情況下,可以分兩步走:
創(chuàng)建一張臨時(shí)表
將數(shù)據(jù)插入臨時(shí)表
創(chuàng)建臨時(shí)表
create table order_2022121819 like `order`;
將 order 表的數(shù)據(jù)插入到 order_2022121819 表中,也就是實(shí)現(xiàn)數(shù)據(jù)備份的功能。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-441422.html
insert into order_2022121819 select * from `order`;
整合上面兩條命令文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441422.html
create table order_2022121820
select * from `order`;
到了這里,關(guān)于MySQL特殊函數(shù)使用技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!