最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中insert并發(fā)問題(on?DUPLICATE?KEY?UPDATE)

 更新時間:2023年01月09日 10:59:39   作者:方才兄  
本文主要介紹了mysql中insert并發(fā)問題(on?DUPLICATE?KEY?UPDATE),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

小編最近在項目中,遇到了一個問題,因為并發(fā)insert造成了臟數(shù)據(jù),主要場景是:

  • 根據(jù)查詢數(shù)據(jù)庫的結(jié)果:存在,則進行更新;不存在,則進行新增;
  • 還有一個場景需求:若已存在,則僅查詢;不存在,則進行新增;

百度發(fā)現(xiàn),mysql已經(jīng)為我們提供了相應(yīng)的sql語句去實現(xiàn)這些場景。

一、insert,存在則更新,不存在則新增

語法:on DUPLICATE KEY UPDATE

1、表結(jié)構(gòu)如下:

CREATE TABLE `testMfc` (                                   
           `id` int(11) NOT NULL AUTO_INCREMENT,                    
           `age` int(11) DEFAULT NULL,                              
           `name` varchar(20) DEFAULT NULL,                         
           `num` int(11) DEFAULT NULL,                              
           PRIMARY KEY (`id`),                                      
           UNIQUE KEY `uk_01` (`age`,`name`)                        
         ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4  

注意:想要使用該語法,必須利用“唯一索引”或者“主鍵索引”,只有產(chǎn)生“索引沖突”,該語法才能正常生效。

此處建立唯一索引:age列和name列

插入初始數(shù)據(jù):

insert into testMfc values (null, 1,'1',30),(null,2,'2',40)

2、sql語句 

已存在,則更新:(影響行數(shù)為:2,如果使用mybatis,返回值 int =2,同時該語句可返回當(dāng)前 主鍵)

 insert into testMfc values (null, 1,'1',30) on duplicate key update num = 1;

 不存在,則新增:(影響行數(shù)為:1,如果使用mybatis,返回值 int =1,同時該語句可返回當(dāng)前 主鍵)

insert into testMfc values (null, 3,'3',50) on duplicate key update num = 1;

 

3、批量插入,某一條記錄存在,則更新;其余進行新增

insert into testMfc values 
(null, 3,'3',300), 
(null, 4,'4',400),
(null, 5,'5',500),
(null, 2,'2',200)
on duplicate key update num = values(num);

更新:age = 2 和 age =3 的num屬性,新增age = 4 和 5 的數(shù)據(jù)

注意: num = values(num) ,此處的格式,必須是 values(列名),才能更新到對應(yīng)的行。

mybatis語法:(與該表無關(guān),則用作語法參考)

@Insert({
        "<script>",
        "insert into weekly_item (weekly_id, weekly_task_name," +
                "task_id, plan, project_id,duty_user_key, status, copy_status," +
                "create_at, update_at, comment_id,complete)" +
                "<foreach collection='insertList' item='item' open='values '  separator=','> " +
                "(#{item.weeklyId,jdbcType=INTEGER}," +
                "#{item.weeklyTaskName,jdbcType=VARCHAR}," +
                "#{item.taskId,jdbcType=INTEGER}," +
                "#{item.plan,jdbcType=VARCHAR}," +
                "#{item.projectId,jdbcType=INTEGER}," +
                "#{item.dutyUserKey,jdbcType=VARCHAR}," +
                "#{item.status,jdbcType=TINYINT}," +
                "#{item.copyStatus,jdbcType=TINYINT}," +
                "now()," +
                "now()," +
                "#{item.commentId,jdbcType=INTEGER}," +
                "#{item.complete,jdbcType=VARCHAR})" +
                "</foreach>"+
                "ON DUPLICATE KEY UPDATE " +
                "complete = VALUES(complete)",
        "</script>"
})
void insertBatchOrUpdate(@Param("insertList") List<WeeklyItem> copyItemList);

二、insert,存在則不進行任何操作;不存在則新增

語法:insert ignore into 表名

1、sql語句

注意:

  • 已存在:(影響行數(shù)為:0,如果使用mybatis,返回值 int =0,該語句不能 返回當(dāng)前 主鍵)
  • 不存在則新增:(影響行數(shù)為:1,如果使用mybatis,返回值 int =1,該語句 可以 返回當(dāng)前 主鍵)
 insert ignore into testMfc values (null,1,'1',123);

三、總結(jié)

mysql還提供了其他原子性操作,比如說:insert,若已存在,則先刪除再新增,個人覺得可以使用存在則更新操作代替,所以此處就不做介紹,希望對你們有用。

備注: 網(wǎng)上有人提問,on DUPLICATE KEY UPDATE 在mysql客戶端可以正常使用,但是在mybatis就沒有效果,既不更新也不新增,同時語句還不報錯。小編剛也遇到了“類似情況”,后來發(fā)現(xiàn)是參數(shù)傳錯了,粗心了呀。還有一個是sql語句insert的時候,將id也賦值了,這個時候就是主鍵沖突了??赡懿皇俏覀兿胍淖远x“唯一索引”

 到此這篇關(guān)于mysql中insert并發(fā)問題(on DUPLICATE KEY UPDATE)的文章就介紹到這了,更多相關(guān)mysql insert并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Navicat如何遠程連接云服務(wù)器數(shù)據(jù)庫

    Navicat如何遠程連接云服務(wù)器數(shù)據(jù)庫

    這篇文章主要介紹了Navicat如何遠程連接云服務(wù)器數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • MySql實現(xiàn)跨表查詢的方法詳解

    MySql實現(xiàn)跨表查詢的方法詳解

    本篇文章是對MySql實現(xiàn)跨表查詢的方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL之存儲引擎使用及說明

    MySQL之存儲引擎使用及說明

    這篇文章主要介紹了MySQL之存儲引擎使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mysql Innodb表空間卸載、遷移、裝載的使用方法

    mysql Innodb表空間卸載、遷移、裝載的使用方法

    從MySQL的Innodb特性中我們知道,Inndob的表空間有共享和獨享的特點,如果是共享的。則默認(rèn)會把表空間存放在一個文件中(ibdata1),當(dāng)開啟獨享表空間參數(shù)Innodb_file_per_table時,會為每個Innodb表創(chuàng)建一個.ibd的文件。文章討論在獨享表空間卸載、裝載、遷移Innodb表的情況
    2013-11-11
  • Linux下修改MySQL編碼的方法

    Linux下修改MySQL編碼的方法

    有時候因為編碼需要修改mysql的編碼,windows下修改有圖文界面簡單一些,linux大家就可以參考下面的方法
    2012-04-04
  • SQL語句中SUM與COUNT的區(qū)別深入分析

    SQL語句中SUM與COUNT的區(qū)別深入分析

    本篇文章是對SQL語句中SUM與COUNT的區(qū)別進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Windows11下MySQL?8.0.29?安裝配置方法圖文教程

    Windows11下MySQL?8.0.29?安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows11下MySQL?8.0.29?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • MYSQL中SWITCH語句和循環(huán)語句舉例詳解

    MYSQL中SWITCH語句和循環(huán)語句舉例詳解

    MySQL提供了多種循環(huán)語句來實現(xiàn)循環(huán)操作,其中包括while循環(huán)、loop循環(huán)、repeat循環(huán)和非標(biāo)準(zhǔn)的goto循環(huán),下面這篇文章主要給大家介紹了關(guān)于MYSQL中SWITCH語句和循環(huán)語句的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • 解決修改mysql的data_dir所引發(fā)的錯誤問題

    解決修改mysql的data_dir所引發(fā)的錯誤問題

    本文給大家分享解決修改mysql的data_dir所引發(fā)的錯誤問題,非常不錯具有參考借鑒價值,需要的朋友參考下吧
    2017-04-04
  • mysql 8.0.15 winx64安裝配置方法圖文教程

    mysql 8.0.15 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論

六枝特区| 黔东| 离岛区| 霍邱县| 固始县| 光泽县| 哈密市| 秦皇岛市| 宜州市| 阜平县| 小金县| 三亚市| 琼中| 洛阳市| 睢宁县| 确山县| 大足县| 甘泉县| 商南县| 花垣县| 绥化市| 祥云县| 嘉祥县| 玉龙| 阳新县| 饶阳县| 民和| 突泉县| 红桥区| 得荣县| 汤原县| 绵阳市| 柏乡县| 邹城市| 射阳县| 沈丘县| 格尔木市| 清镇市| 太仓市| 津市市| 定州市|