1. 程式人生 > 資料庫 >MySQL插入語句insert into,insert ignore into,insert into ... on duplicate key update,replace into-解決唯一鍵約束

MySQL插入語句insert into,insert ignore into,insert into ... on duplicate key update,replace into-解決唯一鍵約束

文章目錄

 

當MySQL表字段設定unique key或者primary key時,被約束的欄位就必須是唯一的。新插入資料直接使用insert into,如果出現唯一性衝突,就會丟擲異常。我們可以根據需求選擇合適的插入語句。

為了演示,我們先新建一張user表,SQL語句如下,其中user_id為主鍵,username為唯一索引

 
  1. SET NAMES utf8mb4;

  2. SET FOREIGN_KEY_CHECKS = 0;

  3.  
  4. -- ----------------------------

  5. -- Table structure for user

  6. -- ----------------------------

  7. DROP TABLE IF EXISTS `user`;

  8. CREATE TABLE `user` (

  9. `user_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '使用者id',

  10. `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '使用者名稱',

  11. `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密碼',

  12. `mobile_phone_number` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手機號碼',

  13. `email` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '郵箱',

  14. `delete_state` tinyint(1) UNSIGNED DEFAULT 0 COMMENT '使用者狀態,1表示刪除,0表示未刪除',

  15. `create_time` datetime(0) DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',

  16. `update_time` datetime(0) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時間',

  17. PRIMARY KEY (`user_id`) USING BTREE,

  18. UNIQUE INDEX `uk_username`(`username`) USING BTREE COMMENT '使用者名稱唯一'

  19. ) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

  20.  
  21. -- ----------------------------

  22. -- Records of user

  23. -- ----------------------------

  24. INSERT INTO `user` VALUES (1, 'JourWon', '123456', '13800000000', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  25. INSERT INTO `user` VALUES (2, '馬雲', '123456', '13800000011', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  26. INSERT INTO `user` VALUES (3, '馬化騰', '123456', '13800000022', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  27. INSERT INTO `user` VALUES (4, '李彥巨集', '123456', '13800000033', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  28. INSERT INTO `user` VALUES (5, '任正非', '123456', '13800000044', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  29. INSERT INTO `user` VALUES (6, 'Jobs', '123456', '13800000055', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  30. INSERT INTO `user` VALUES (7, 'Bill Gates', '123456', '13800000066', 'Bill [email protected]', 0, CURRENT_TIMESTAMP, NULL);

  31. INSERT INTO `user` VALUES (8, 'Buffett', '123456', '13800000077', '[email protected]', 0, CURRENT_TIMESTAMP, NULL);

  32.  
  33. SET FOREIGN_KEY_CHECKS = 1;

常用插入語句

insert into

當插入資料時,如果唯一性校驗出現重複問題,則報錯;

如果沒有重複性問題,則執行插入操作。

簡單總結:重複則報錯,不重複則插入。

示例

 
  1. INSERT INTO `user`

  2. VALUES

  3. ( 8, 'Buffett', '123456', '13800000077', '[email protected]', 0, CURRENT_TIMESTAMP, NULL );

執行結果

 
  1. INSERT INTO `user`

  2. VALUES

  3. ( 8, 'Buffett', '123456', '13800000077', '[email protected]', 0, CURRENT_TIMESTAMP, NULL )

  4. > 1062 - Duplicate entry '8' for key 'user.PRIMARY'

  5. > 時間: 0.001s

insert ignore into

當插入資料時,如果唯一性校驗出現重複問題,則忽略錯誤,只以警告形式返回,不執行此SQL語句;

如果沒有重複性問題,則執行插入操作。

簡單總結:重複則忽略,不重複則插入。

示例

 
  1. INSERT IGNORE INTO `user`

  2. VALUES

  3. ( 8, 'Buffett', '123456', '13800000077', '[email protected]', 0, CURRENT_TIMESTAMP, NULL );

執行結果

 
  1. INSERT IGNORE INTO `user`

  2. VALUES

  3. ( 8, 'Buffett', '123456', '13800000077', '[email protected]', 0, CURRENT_TIMESTAMP, NULL )

  4. > Affected rows: 0

  5. > 時間: 0.001s

insert into … on duplicate key update

當插入資料時,如果唯一性校驗出現重複問題,則在原有記錄基礎上,更新指定欄位內容,其它欄位內容保留;

如果沒有重複性問題,則執行插入操作。

簡單總結:重複則更新指定欄位,不重複則插入

示例

 
  1. INSERT INTO `user` ( username, PASSWORD, mobile_phone_number, email )

  2. VALUES

  3. ( 'Buffett', '123456', '13800000088', '[email protected]' )

  4. ON DUPLICATE KEY UPDATE mobile_phone_number = '13800000088';

執行結果

 
  1. INSERT INTO `user` ( username, PASSWORD, mobile_phone_number, email )

  2. VALUES

  3. ( 'Buffett', '123456', '13800000088', '[email protected]' )

  4. ON DUPLICATE KEY UPDATE mobile_phone_number = '13800000088'

  5. > Affected rows: 2

  6. > 時間: 0.022s

表記錄,mobile_phone_number更新了,update_time也有值了,但是user_id沒有變

user_idusernamepasswordmobile_phone_numberemaildelete_statecreate_timeupdate_time
8Buffett12345613800000088[email protected]02020-05-28 09:49:532020-05-28 10:04:30

replace into

replace into表示插入替換資料,當插入資料時,如果唯一性校驗出現重複問題,刪除舊記錄,插入新記錄;

如果沒有重複性問題,則執行插入操作,效果和insert into是一樣的。

簡單總結:重複則先刪除再插入新記錄,不重複則插入

示例

 
  1. REPLACE INTO `user` ( username, PASSWORD, mobile_phone_number, email )

  2. VALUES

  3. ( 'Buffett', '123456', '13800000099', '[email protected]' );

執行結果

 
  1. REPLACE INTO `user` ( username, PASSWORD, mobile_phone_number, email )

  2. VALUES

  3. ( 'Buffett', '123456', '13800000099', '[email protected]' )

  4. > Affected rows: 2

  5. > 時間: 0.019s

表記錄,user_id和mobile_phone_number變了,update_time變為了空

user_idusernamepasswordmobile_phone_numberemaildelete_statecreate_timeupdate_time
10Buffett12345613800000099[email protected]02020-05-28 09:49:53 

使用場景總結

  • 如果出現重複異常,希望捕獲異常,則使用insert into

  • 如果出現重複異常,希望儲存舊紀錄,忽略新紀錄,則使用insert ignore into

  • 如果出現重複異常,希望更新指定欄位,則使用insert into … on duplicate key update

  • 如果出現重複異常,希望刪除舊記錄,插入新記錄,則使用replace into