參考文章:Mysql:如果數(shù)據(jù)存在則更新,不存在則插入
場(chǎng)景
工作中有遇到需要配置一些指定的字段數(shù)據(jù),但數(shù)據(jù)量大,不清楚之前是否有配置過(guò),正確的思路應(yīng)該是如果有這條數(shù)據(jù)了,那么更新數(shù)據(jù)的值,如果沒(méi)有這條數(shù)據(jù),那么應(yīng)該插入一條數(shù)據(jù)。
比如需要根據(jù)不同國(guó)家進(jìn)行不同功能的開(kāi)啟或者關(guān)閉,表結(jié)構(gòu)如下:
CREATE TABLE `region_config_info` (
`id` varchar(64) NOT NULL,
`create_time` bigint(20) DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`func_desc` varchar(128) DEFAULT NULL COMMENT '功能說(shuō)明',
`func_enable` bit(1) DEFAULT b'0' COMMENT '0-未開(kāi)啟,1-已開(kāi)啟',
`func_type` int(4) NOT NULL COMMENT '功能類型',
`region_code` varchar(8) NOT NULL COMMENT '國(guó)家的alpha2碼',
`update_time` bigint(20) DEFAULT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`),
KEY `region_config_info_region_code_IDX` (`region_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
插入三條數(shù)據(jù):
INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '是否支持二維碼分享', b'0', 0, 'FR', current_timestamp());
INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '免費(fèi)抽獎(jiǎng)活動(dòng)', b'0', 1, 'FR', current_timestamp());
INSERT INTO region_config_info
(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES(UUID(), current_timestamp(), '打折活動(dòng)', b'1', 2, 'FR', current_timestamp());
插入后,表數(shù)據(jù)如圖所示:
更新/插入數(shù)據(jù)
知道唯一索引的值
mysql語(yǔ)法支持?jǐn)?shù)據(jù)存在更新,不存在插入。判斷的依據(jù)是唯一索引的字段是否存在,對(duì)于本文中的例子就是主鍵id。
如果已知主鍵id,那么可以使用DUPLICATE、REPLACE INTO方式處理數(shù)據(jù)
DUPLICATE
語(yǔ)法
INSERT INTO 表名(唯一索引列, 列2, 列3) VALUE(值1, 值2, 值3) ON DUPLICATE KEY UPDATE 列=值, 列=值
測(cè)試的sql如下:
- 對(duì)于aa4b49ff-661b-11ed-ae64-6c4b90aa5ada這條數(shù)據(jù),如果沒(méi)有則插入,如果有,則更新func_enable為關(guān)閉且更新update_time。
INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUE("aa4b49ff-661b-11ed-ae64-6c4b90aa5ada", current_timestamp(), '打折活動(dòng)', b'0', 2, 'FR', current_timestamp())
ON DUPLICATE KEY UPDATE func_enable= b'0',update_time=current_timestamp()
執(zhí)行結(jié)果如下:結(jié)果為有本條數(shù)據(jù),因此更新了func_enable和update_time
- 對(duì)于1這條數(shù)據(jù),如果沒(méi)有則插入,如果有,則更新
INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUE("1", current_timestamp(), '打折活動(dòng)', b'1', 2, 'CN', current_timestamp())
ON DUPLICATE KEY UPDATE func_enable= b'1',update_time=current_timestamp()
執(zhí)行結(jié)果如下:結(jié)果為新插入一條id為1的數(shù)據(jù)
REPLACE INTO
語(yǔ)法
REPLACE INTO 表名稱(列1, 列2, 列3) VALUES(值1, 值2, 值3)
測(cè)試的sql如下:
- 對(duì)于1這條數(shù)據(jù),如果沒(méi)有則插入,如果有,則更新。
REPLACE INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES("1", current_timestamp(), '打折活動(dòng)', b'1', 2, 'IN', current_timestamp())
執(zhí)行結(jié)果如下:結(jié)果為有本條數(shù)據(jù),數(shù)據(jù)都按照新的數(shù)值插入的,create_time和update_time都更新了
測(cè)試的sql如下:
- 對(duì)于2這條數(shù)據(jù),如果沒(méi)有則插入,如果有,則更新。
REPLACE INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
VALUES("2", current_timestamp(), '免費(fèi)抽獎(jiǎng)活動(dòng)', b'1', 1, 'IN', current_timestamp())
執(zhí)行結(jié)果如下:結(jié)果為無(wú)本條數(shù)據(jù),插入一條id為2的數(shù)據(jù)
并不知道唯一索引的值,只想插入/更新符合某些條件的數(shù)據(jù)
如果不知道主鍵id的情況下,根據(jù)部分條件查找進(jìn)行插入或更新數(shù)據(jù),比如:配置國(guó)家IN的“是否支持二維碼分享”活動(dòng)為開(kāi)啟,但并不知道這條數(shù)據(jù)在或者不在,也不知道主鍵id的情況,該如何處理呢?
插入語(yǔ)句
INSERT INTO region_config_info(id, create_time, func_desc, func_enable, func_type, region_code, update_time)
SELECT UUID(), current_timestamp(), '是否支持二維碼分享', b'1', 0, 'IN', current_timestamp()
from DUAL
where not exists(select id from region_config_info where region_code = 'IN' and func_type = 0);
執(zhí)行結(jié)果:不存在region_code為IN且func_type是0的數(shù)據(jù),因此插入了這條數(shù)據(jù)。可以多次運(yùn)行這條數(shù)據(jù),并沒(méi)有新插入數(shù)據(jù),且原來(lái)數(shù)據(jù)的create_time、update_time都沒(méi)有更新。
如圖:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-459512.html
更新語(yǔ)句
update region_config_info c set c.func_enable = 1, c.update_time = current_timestamp()
where id in
(select a.id from
(select * from region_config_info where func_type = 0 and region_code in ('IN','FR') and func_enable != 1) as a)
執(zhí)行結(jié)果:更新了FR國(guó)家的func_type=0的開(kāi)啟狀態(tài),IN的由于已經(jīng)是1了,所以無(wú)需更新,可以看到結(jié)果中的update_time是有改變的。此語(yǔ)句可以批量更新一些指定條件的數(shù)據(jù)。
如圖:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-459512.html
到了這里,關(guān)于mysql“數(shù)據(jù)不存在插入,存在則更新”實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!