成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL中insertOrUpdate的功能如何實現的

數據庫 MySQL
由于 value 列存在唯一鍵約束,并且已經存在一條記錄 value='a',所以不會插入新記錄,而是會執行更新操作。但即便如此,自增主鍵 id 的計數器依然會增加。

insertOrUpdate 在我們日常使用中比較常見,那么它是如何實現的呢,不知道大家有沒有考慮過呢?

在 MySQL 中,可采用INSERT INTO ... ON DUPLICATE KEY UPDATE語句實現 insertOrUpdate 功能。

值得留意的是,在出現重復鍵時,會在先前索引值和當前值之間添加臨時鍵鎖,這可能導致死鎖。

若要使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 語句,需滿足以下條件:

  1. 表必須具有主鍵或唯一索引;
  2. 插入的數據必須包含主鍵或唯一索引列;
  3. 主鍵或唯一索引列的值不能為 NULL。

舉個例子:

設想有一張 student 表,包括 id、name 和 age 三列,其中 id 是主鍵。現在要插入一條數據,若該數據的主鍵已存在,則更新該數據的姓名和年齡,否則插入該數據。

INSERT INTO student (id, name, age) VALUES (1, 'Paidaxing', 20)
ON DUPLICATE KEY UPDATE name='Paidaxing', age=18;

底層實現

使用INSERT INTO ... ON DUPLICATE KEY UPDATE語句,如果數據庫中已存在具有相同唯一索引或主鍵的記錄,則更新該記錄。其底層原理和執行流程如下:

  1. 檢查唯一索引或主鍵:執行INSERT INTO ... ON DUPLICATE KEY UPDATE語句時,數據庫首先嘗試插入新行。在此過程中,數據庫會檢查表中是否存在與新插入行具有相同的唯一索引或主鍵的記錄。
  2. 沖突處理:如果不存在沖突的唯一索引或主鍵,新行將被正常插入。如果存在沖突,即發現重復的唯一索引或主鍵值,數據庫將不會插入新行,而是轉而執行更新操作。
  3. 執行更新:在檢測到唯一索引或主鍵的沖突后,數據庫將根據ON DUPLICATE KEY UPDATE后面指定的列和值來更新已存在的記錄。這里可以指定一個或多個列進行更新,并且可以使用 VALUES 函數引用原本嘗試插入的值。

相似 SQL

除了 INSERT INTO ... ON DUPLICATE KEY UPDATE 之外,還有一些類似的 SQL 語句,比如:

  1. REPLACE INTO:如果存在唯一索引沖突,則先刪除舊記錄,再插入新記錄。
  2. INSERT IGNORE INTO:如果唯一索引沖突,則忽略該條插入操作,不報錯。

淺談主鍵跳躍

在 MySQL 中使用 INSERT ON DUPLICATE KEY UPDATE 語句時,如果插入操作失敗(因為主鍵或唯一鍵沖突),而執行了更新操作,確實會導致自增主鍵計數器增加,即使沒有實際插入新記錄。

這是因為 MySQL 在嘗試插入新記錄時,會先分配一個新的自增主鍵值,無論后續是插入成功還是執行更新操作,這個主鍵值都已經被分配并且會增加。

例如,假設有一個表 test 定義如下:

CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    value VARCHAR(255),
    UNIQUE KEY unique_value (value)
);

然后執行以下語句:

INSERT INTO test (value) VALUES ('a')
ON DUPLICATE KEY UPDATE value = 'a';

圖片圖片

再執行一次:

圖片圖片

此時,由于 value 列存在唯一鍵約束,并且已經存在一條記錄 value='a',所以不會插入新記錄,而是會執行更新操作。但即便如此,自增主鍵 id 的計數器依然會增加。

然后再插入一條新的記錄:

圖片圖片

這意味著下一次插入新記錄時,自增主鍵的值會比之前增加,即 2 已經被用過了,雖然沒插入成功,但是新的記錄就直接用 3 了。

責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2011-09-01 18:38:02

SQL Server 文件流功能

2009-07-09 16:12:53

WeblogicJDBC

2016-08-11 08:24:39

AndroidIntentShareTestDe

2020-12-30 08:12:17

SQLExcel分列

2021-10-28 19:36:20

SQLExcel功能

2021-11-26 10:08:57

鴻蒙HarmonyOS應用

2023-10-31 08:32:59

2020-05-14 14:57:48

MySQLExcel排序

2024-03-27 08:28:31

元素拖拽API文件上傳

2025-05-09 08:21:29

2011-07-22 13:22:10

Java.NETDataTable

2024-02-21 09:46:58

2011-03-25 14:53:39

DB2數據庫Oracle

2011-08-02 15:42:14

PythonMySQL

2021-09-17 12:50:10

MySQL數據庫ACID

2010-05-24 11:26:27

MySQL鎖

2011-05-16 11:29:00

MySQL自動備份

2009-12-02 15:45:04

PHP抓取天氣預報

2010-06-07 13:53:04

MySQL數據庫表

2017-09-01 15:42:00

MySQLOracledblink功能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美综合久久 | 色综合99 | 日韩免费一区二区 | 毛片a级毛片免费播放100 | 亚洲成人免费av | 女同videos另类 | 在线免费观看视频你懂的 | 亚洲国产一区二区三区在线观看 | 国产乱码精品一区二区三区忘忧草 | 久久国产精品一区二区三区 | 中文字幕精品一区二区三区精品 | 99re视频| 亚洲a人 | 国产精品亚洲综合 | 国产精品一区二区三 | 日韩亚洲视频 | 99爱在线| 久久久久91 | 一区二区三区四区在线 | 国产精品欧美精品 | 秋霞电影一区二区三区 | 久操伊人 | 国产精品久久久一区二区三区 | 成人在线一区二区 | 国产一区欧美 | 午夜影院网站 | 欧美成人精品 | 91在线色视频 | 久久精品99国产精品日本 | 男人天堂网址 | www日韩欧美 | 亚洲欧美在线免费观看 | 欧美色偷拍| 亚洲欧美一区二区三区国产精品 | 国产在线精品一区二区 | 狠狠躁18三区二区一区 | 国内自拍偷拍 | 99精品视频免费观看 | av手机免费在线观看 | 亚洲情综合五月天 | 欧美三级在线 |