成人免费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

2020-12-30 08:12:17

SQLExcel分列

2021-10-28 19:36:20

SQLExcel功能

2016-08-11 08:24:39

AndroidIntentShareTestDe

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技術棧公眾號

主站蜘蛛池模板: 国产精品区二区三区日本 | 亚洲激情一级片 | 综合久久av | 成人在线一级片 | 男人的天堂中文字幕 | 精品一区二区视频 | 一级黄色片在线免费观看 | 色婷婷综合久久久中字幕精品久久 | 久久久久91 | 亚洲欧美精品在线 | 国产精品久久久久久吹潮 | a视频在线 | 狠狠操狠狠操 | 九色 在线| 亚洲精品久久久久久一区二区 | 欧美成人不卡 | 国产精品色 | 精品91久久 | 97久久久久久久久 | 国产精品久久久亚洲 | 久久久久国产精品一区二区 | 国产精品久久久久久久久久免费看 | 99精品一区二区 | 国内精品久久久久久 | 免费在线观看一级毛片 | 亚洲欧美另类在线观看 | 91精品国产自产在线老师啪 | 日本精品久久 | 久久久久久久久久久久久久久久久久久久 | 成人一区二区三区在线观看 | 亚洲精品一区二区三区在线 | 欧美亚洲另类丝袜综合网动图 | 国产精品久久亚洲7777 | 在线观看深夜视频 | 欧美日韩高清免费 | 亚洲免费人成在线视频观看 | 九九久久精品 | 日韩欧美亚洲 | 凹凸日日摸日日碰夜夜 | av天天澡天天爽天天av | 久草高清视频 |