亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中的insert-on-duplicate語(yǔ)句舉例詳解

 更新時(shí)間:2024年06月08日 10:28:13   作者:Charge8  
這篇文章主要給大家介紹了關(guān)于MySQL中insert-on-duplicate語(yǔ)句的相關(guān)資料,文中通過(guò)圖文以及代碼示例將insert-on-duplicate的用法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、insert-on-duplicate語(yǔ)句語(yǔ)法

注意:ON DUPLICATE KEY UPDATE只是 MySQL的特有語(yǔ)法,并不是SQL標(biāo)準(zhǔn)語(yǔ)法!

INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一種用于插入數(shù)據(jù)并處理重復(fù)鍵沖突的語(yǔ)法。

這個(gè)語(yǔ)法適用于在 insert的時(shí)候,如果insert的數(shù)據(jù)會(huì)引起唯一索引(包括主鍵索引)的沖突,即唯一值重復(fù)了,則不會(huì)執(zhí)行insert操作,而執(zhí)行后面的update操作。

基本語(yǔ)法為:

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...) 
ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, ...;

-- 一般 Update子句可以使用 VALUES(col_name)獲取 insert部分的值
INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...) 
ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;

說(shuō)明:

  • table_name 是要插入數(shù)據(jù)的表名。
  • (column1, column2, …) 是要插入的列名列表。
  • (value1, value2, …) 是要插入的對(duì)應(yīng)列的值列表。
  • ON DUPLICATE KEY UPDATE 子句后面指定了在沖突時(shí)需要執(zhí)行的更新操作。
  • column1 = value1, column2 = value2, … 是要更新的列和對(duì)應(yīng)的新值。
  • column1 = VALUES(column1), column2 = VALUES(column2), … 是要更新的列和對(duì)應(yīng)的新值(insert部分的值)。

insert-on-duplicate語(yǔ)句處理邏輯:

語(yǔ)句是根據(jù)唯一索引判斷記錄是否重復(fù)的。當(dāng)執(zhí)行插入操作時(shí),如果唯一鍵不沖突(表中不存在記錄),則執(zhí)行插入操作;如果遇到唯一鍵沖突(表中存在記錄),則會(huì)執(zhí)行更新操作,使用給定的新值來(lái)更新沖突行中的列。

  • 如果不存在記錄,插入,則影響的行數(shù)為1;
  • 如果存在記錄,可以更新字段,則影響的行數(shù)為2;
  • 如果存在記錄,并且更新的值和原有的值相同,則影響的行數(shù)為0。

注意:如果表同時(shí)存在多個(gè)唯一索引,只會(huì)根據(jù)第一個(gè)在數(shù)據(jù)庫(kù)中存在相應(yīng)value的列唯一索引做duplicate判斷。

二、示例表操作使用

t_user表結(jié)構(gòu):表中有一個(gè)主鍵id、一個(gè)唯一索引idx_name;

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `user_name` varchar(30) NOT NULL  COMMENT '用戶名',
  `age` int NOT NULL DEFAULT '0' COMMENT '年齡',
  `height` int DEFAULT '0' COMMENT '身高cm',
  `type` int(1) DEFAULT NULL COMMENT '類型',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_name` (`user_name`) USING BTREE,
  KEY `idx_type` (`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8  COMMENT='用戶表';

1、不存在記錄,插入的情況

INSERT into t_user(user_name, age, height) VALUES("lisi", 17, 180) on DUPLICATE KEY UPDATE age = 18;

2、存在記錄,可以更新字段的情況

INSERT into t_user(user_name, age, height) VALUES("lisi", 17, 180) on DUPLICATE KEY UPDATE age = 18;

3、存在記錄,不可以更新字段的情況

INSERT into t_user(user_name, age, height, type) VALUES("lisi", 18, 180, 1) on DUPLICATE KEY UPDATE age = 18;

4、存在多個(gè)唯一索引時(shí)

如果表同時(shí)存在多個(gè)唯一索引,只會(huì)根據(jù)第一個(gè)在數(shù)據(jù)庫(kù)中存在相應(yīng)value的列唯一索引做duplicate判斷。

1)數(shù)據(jù)庫(kù)中id = 2的記錄不存在,user_name="lisi"的記錄存在,所以會(huì)根據(jù)第二個(gè)唯一索引 user_name做duplicate判斷:執(zhí)行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisi", 27, 280, 0) on DUPLICATE KEY UPDATE age = 28;

2)數(shù)據(jù)庫(kù)中id = 2的記錄不存在,user_name="lisisi"的記錄不存在,所以不存在重復(fù)鍵沖突:執(zhí)行 insert操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 27, 280, 0) on DUPLICATE KEY UPDATE age = 28;

3)數(shù)據(jù)庫(kù)中 id = 2的記錄存在,user_name="lisisi"的記錄存在,所以會(huì)根據(jù)第一個(gè)唯一索引id做duplicate判斷:執(zhí)行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 37, 380, 1) on DUPLICATE KEY UPDATE age = 38;

4)數(shù)據(jù)庫(kù)中 id = 2的記錄存在,user_name="lisisi2"的記錄不存在,所以會(huì)根據(jù)第一個(gè)唯一索引id做duplicate判斷:執(zhí)行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi2", 47, 480, 0) on DUPLICATE KEY UPDATE age = 48;

5、VALUES(col_name)使用

一般 Update子句可以使用 VALUES(col_name)獲取 insert部分的值。也是項(xiàng)目中使用最多的方式。

注意:VALUES()函數(shù)只在INSERT…UPDATE語(yǔ)句中有意義,其它時(shí)候會(huì)返回NULL。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 57, 480, 0) on DUPLICATE KEY UPDATE age = VALUES(age) + 100;

6、批量操作

批量操作之前表中數(shù)據(jù)如下:

批量語(yǔ)句如下:

INSERT INTO t_user(user_name, age, height, type) 
VALUES
("lisi", 71, 701, 0),
("lisisi", 72, 280, 1),
("zhangsan", 73, 703, 0),
("wangwu", 74, 704, null),
("laoliu", 75, null, null)
ON DUPLICATE KEY UPDATE 
user_name = VALUES(user_name),
age = VALUES(age),
height = VALUES(height),
type = VALUES(type);

批量語(yǔ)句執(zhí)行操作之后表中數(shù)據(jù)如下:

參考文章:

總結(jié)

到此這篇關(guān)于MySQL中insert-on-duplicate語(yǔ)句的文章就介紹到這了,更多相關(guān)MySQL的insert-on-duplicate語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL之批量插入的4種方案總結(jié)

    MySQL之批量插入的4種方案總結(jié)

    這篇文章主要介紹了MySQL之批量插入的4種方案總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 數(shù)據(jù)庫(kù)SQL SELECT查詢的工作原理

    數(shù)據(jù)庫(kù)SQL SELECT查詢的工作原理

    今天小編就為大家分享一篇關(guān)于數(shù)據(jù)庫(kù)SQL SELECT查詢的工作原理,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • MySql delimiter的作用是什么

    MySql delimiter的作用是什么

    其實(shí)就是告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。默認(rèn)情況下,delimiter是分號(hào);。在命令行客戶端中,如果有一行命令以分號(hào)結(jié)束,那么回車后,mysql將會(huì)執(zhí)行該命令。
    2010-09-09
  • MySQL交叉表實(shí)現(xiàn)分享

    MySQL交叉表實(shí)現(xiàn)分享

    在某些數(shù)據(jù)庫(kù)中有交叉表,但在MySQL中卻沒(méi)有這個(gè)功能,但網(wǎng)上看到有不少朋友想找出一個(gè)解決方法,特發(fā)貼集思廣義
    2012-01-01
  • replace MYSQL字符替換函數(shù)sql語(yǔ)句分享(正則判斷)

    replace MYSQL字符替換函數(shù)sql語(yǔ)句分享(正則判斷)

    最近更新網(wǎng)站發(fā)現(xiàn)一些字段的值不是預(yù)期的效果,需要替換下值,通過(guò)下面的sql語(yǔ)句,直接執(zhí)行就可以了
    2012-06-06
  • mysql 批量修復(fù)

    mysql 批量修復(fù)

    這篇文章主要介紹了mysql 批量修復(fù),需要的朋友可以參考下
    2016-05-05
  • MySQL之修改數(shù)據(jù)表存儲(chǔ)引擎的三種方式

    MySQL之修改數(shù)據(jù)表存儲(chǔ)引擎的三種方式

    這篇文章主要介紹了MySQL之修改數(shù)據(jù)表存儲(chǔ)引擎的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SQL中實(shí)現(xiàn)SPLIT函數(shù)幾種方法總結(jié)(必看篇)

    SQL中實(shí)現(xiàn)SPLIT函數(shù)幾種方法總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇SQL中實(shí)現(xiàn)SPLIT函數(shù)幾種方法總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • mysql?8.0.28?winx64.zip安裝配置方法圖文教程

    mysql?8.0.28?winx64.zip安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql?8.0.28?winx64.zip安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 深入SQLite基本操作的總結(jié)詳解

    深入SQLite基本操作的總結(jié)詳解

    本篇文章是對(duì)SQLite的基本操作進(jìn)行了總結(jié)和介紹。需要的朋友參考下
    2013-05-05

最新評(píng)論