系統城裝機大師 - 唯一官網:www.farandoo.com!

當前位置:首頁 > 數據庫 > MsSql > 詳細頁面

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

時間:2020-02-18來源:系統城作者:電腦系統城

本文實例講述了mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點。分享給大家供大家參考,具體如下:

replace into和insert into on duplicate key update都是為了解決我們平時的一個問題

就是如果數據庫中存在了該條記錄,就更新記錄中的數據,沒有,則添加記錄。

我們創建一個測試表test


 
  1. CREATE TABLE `test` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  3. `name` varchar(32) DEFAULT '' COMMENT '姓名',
  4. `addr` varchar(256) DEFAULT '' COMMENT '地址',
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向該表中插入一些數據


 
  1. INSERT INTO test
  2. VALUES
  3. (NULL, 'a', 'aaa'),
  4. (NULL, 'b', 'bbb'),
  5. (NULL, 'c', 'ccc'),
  6. (NULL, 'd', 'ddd');

影響行數4,結果如下:

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

我們運行如下語句:


 
  1. REPLACE INTO test VALUES(NULL, 'e', 'eee');

結果顯示,影響行數1條,記錄被插入成功了

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

注意上面的語句,我們并沒有填寫主鍵ID。

然后我們再執行下面的語句:


 
  1. REPLACE INTO test VALUES(1, 'aa', 'aaaa');

結果顯示,影響行數2條,ID為1的記錄被更新成功了

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

為什么會出現這種情況,原因就是replace into會首先嘗試先往表里面插入記錄,因為我們的ID是主鍵,不可重復,顯然這條記錄是無法插入成功的,然后replace into會把這條已存在的記錄刪掉,然后再插入,所以會顯示影響行數是2。

我們再運行下面這條語句:


 
  1. REPLACE INTO test(id,name) VALUES(1, 'aaa');

這里我們只指定id,name字段,我們來看看replace into后addr字段內容是否還存在

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

顯然addr字段內容沒有了,跟我們上面的分析是一致的,reaplce into先刪除了id為1的記錄,然后再插入記錄,但我們并沒有指定addr的值,所以會如上圖所示那樣。

 

但是有些時候我們的需求是,如果記錄存在則更新指定字段的數據,原有字段數據仍保留,而不是上面所示的,addr字段數據沒有了。

這里就需要用到insert into on duplicate key update

執行如下語句:


 
  1. INSERT INTO test (id, name)
  2. VALUES(2, 'bb')
  3. ON DUPLICATE KEY
  4. UPDATE
  5. name = VALUES(name);

VALUES(字段名)表示獲取當前語句insert的列值,VALUES(name)表示的就是'bb'

結果顯示,影響行數2條

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

如上圖所示,addr字段的值被保留了。

insert into on duplicate key update語句的做法是先插入記錄,如果不成功,則更新記錄,但是為什么影響的行數是2?

我們重新建一張表test2


 
  1. CREATE TABLE `test2` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  3. `sn` varchar(32) DEFAULT '' COMMENT '唯一鍵',
  4. `name` varchar(32) DEFAULT '' COMMENT '姓名',
  5. `addr` varchar(256) DEFAULT '' COMMENT '地址',
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY `sn` (`sn`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

往里面插入點數據


 
  1. INSERT INTO test2
  2. VALUES
  3. (NULL, '01', 'a', 'aaa'),
  4. (NULL, '02', 'b', 'bbb'),
  5. (NULL, '03', 'c', 'ccc'),
  6. (NULL, '04', 'd', 'ddd');

我們運行如下語句:


 
  1. INSERT INTO test2 (sn, name, addr)
  2. VALUES
  3. ('02', 'bb', 'bbbb')
  4. ON DUPLICATE KEY
  5. UPDATE
  6. name = VALUES(name),
  7. addr = VALUES(addr);

結果如下:

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

每運行一次上面的語句,雖然影響行數為0,但表test2的自增字段就加1。

mysql 中 replace into 與 insert into on duplicate key update 的用法和不同點實例分析

顯然如果insert into on duplicate key update語句僅僅只是在原記錄基礎上進行更新操作的話,自增字段是不會自動加1的,說明它也進行了記錄刪除操作。

先插入記錄,如果不成功,則刪除原記錄,但保留了除update語句后字段的值,然后把保留的值與需要更新的值合并,然后插入一條新記錄。

總結:

replace into 與 insert into on duplicate key update都是先嘗試插入記錄,如果不成功,則刪除記錄,replace into不保留原記錄的值,而insert into on duplicate key update保留。然后插入一條新記錄。

更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL常用函數大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數據庫鎖相關技巧匯總》

希望本文所述對大家MySQL數據庫計有所幫助。

分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

jlzzjlzz亚洲乱熟在线播放