MySQL insert into select 主鍵沖突解決方案
場(chǎng)景
項(xiàng)目中,一張表里的基礎(chǔ)數(shù)據(jù),ID 是以 varchar 類型存入的,由于每年都會(huì)存在變動(dòng),在不改變歷史數(shù)據(jù)的情況下,每年生產(chǎn)一份當(dāng)年使用的數(shù)據(jù),如果當(dāng)年基礎(chǔ)數(shù)據(jù)有變動(dòng),則改動(dòng)當(dāng)年的數(shù)據(jù),往年歷史數(shù)據(jù)不做變更,通過邏輯進(jìn)行數(shù)據(jù)分隔。
方案
1、小批量數(shù)據(jù)
小批量數(shù)據(jù),由于數(shù)據(jù)量少,通過 復(fù)制數(shù)據(jù)庫中原數(shù)據(jù)生成 insert 腳本,使用 UUID 來處理了主鍵問題,如下:
INSERT INTO test_category (id, create_date, update_date, label, sort, type, value, year) VALUES (replace(uuid(),'-',''), now(), now(), '汽車', 1, 'category', 'automobile', '2021'); INSERT INTO test_category (id, create_date, update_date, label, sort, type, value, year) VALUES (replace(uuid(),'-',''), now(), now(), '手機(jī)', 2, 'category', 'phone', '2021'); ...
因?yàn)閿?shù)據(jù)量少,自己修改腳本也花不了多長(zhǎng)時(shí)間,那么,如果數(shù)據(jù)量大,再這么寫就不行了,需要處理成百上千,甚至更多的時(shí)候,要怎么做呢?
2、大批量數(shù)據(jù)
這里,我通過 UUID + 自增來實(shí)現(xiàn),具體 SQL 如下:
INSERT INTO test_category (id, name, kind_id, sort, type, year) select concat(left(replace(uuid(),'-',''),28),(@i:=@i+1)) as id, name, kind_id, sort, type,'2022' as year from exhibits_dict_new edn left join (select @i:=1000) as t on 1 = 1 where year = '2021';
需要注意,這里關(guān)聯(lián)了一張臨時(shí)自增表,即:(select @i:=1000) as t 這里定義的 1000 為從 1000 開始,每一條記錄,自增 1,為了避免與原 ID 出現(xiàn)重復(fù)現(xiàn)象,使用了 UUID 函數(shù)生成新記錄,并截取后重新進(jìn)行自增拼接,這樣,就完美的解決了使用 insert into select 在同一張表里進(jìn)行數(shù)據(jù)插入時(shí)的 主鍵沖突問題。
3、備份表常用 SQL
-- 創(chuàng)建一張表結(jié)構(gòu)、索引信息一模一樣的 空表 create table test_category_bak like test_category; -- 往新備份的表中,插入需要備份的數(shù)據(jù) 全量備份,也可以在后面加上 where 條件進(jìn)行條件備份 insert into test_category_bak select * from test_category; -- 復(fù)制表,包含表中的數(shù)據(jù) create table table_name2 as select * from table_name1; -- 只復(fù)制表,不包含數(shù)據(jù)內(nèi)容 create table table_name2 as select * from table_name1 where 1=2;
到此這篇關(guān)于MySQL insert into select 主鍵沖突解決方案的文章就介紹到這了,更多相關(guān)MySQL insert into select 主鍵沖突內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SQL?Server使用SELECT?INTO實(shí)現(xiàn)表備份的代碼示例
- sql中select into和insert select的用法小結(jié)
- mysql中insert?into...select語句優(yōu)化方式
- mysql使用insert into select插入查出的數(shù)據(jù)
- SELECT...INTO的具體用法
- 使用MySQL實(shí)現(xiàn)select?into臨時(shí)表的功能
- 用SELECT... INTO OUTFILE語句導(dǎo)出MySQL數(shù)據(jù)的教程
- SELECT INTO用法及支持的數(shù)據(jù)庫
相關(guān)文章
基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù)
這篇文章主要介紹了基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09MySQL將版本由5.7.37更新到5.7.39的實(shí)現(xiàn)方式
這篇文章主要介紹了MySQL將版本由5.7.37更新到5.7.39的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12MYSQL存儲(chǔ)過程即常用邏輯知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于MYSQL存儲(chǔ)過程即常用邏輯知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2019-08-08Mysql 查詢JSON結(jié)果的相關(guān)函數(shù)匯總
這篇文章主要介紹了Mysql 查詢 JSON 結(jié)果的相關(guān)函數(shù)匯總,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-11-11mysql oracle和sqlserver分頁查詢實(shí)例解析
最近簡(jiǎn)單的對(duì)oracle,mysql,sqlserver2005的數(shù)據(jù)分頁查詢作了研究,把各自的查詢的語句貼到腳本之家平臺(tái)供大家參考2017-10-10Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解
這篇文章主要介紹了Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解,JDBC(Java DataBase Connectivity:java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系型數(shù)據(jù)庫提供統(tǒng)一訪問,它是由一組用Java語言編寫的類和接口組成的,需要的朋友可以參考下2023-08-08Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
mysql在使用的過程中,難免遇到數(shù)據(jù)庫表誤操作,下面這篇文章主要給大家介紹了關(guān)于Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06