MySQL_插入更新 ON DUPLICATE KEY UPDATE
平時我們在設計資料庫表的時候總會設計 unique 或者 給表加上 primary key 的限制條件.
此時 插入資料的時候 ,經常會有這樣的情況:
我們想向資料庫插入一條記錄:
若資料表中存在以相同主鍵的記錄,我們就更新該條記錄。
否則就插入一條新的記錄。
邏輯上我們需要怎麼寫:
$result = mysql_query('select * from xxx where id = 1');
$row = mysql_fetch_assoc($result);
if($row){
mysql_query('update ...');
}else{
mysql_query('insert ...');
}
但是這樣寫有兩個問題
1、效率太差,每次執行都要執行2個sql
2、高併發的情況下資料會出問題,不能保證原子性
還好MySQL 為我們解決了這個問題:我們可以通過 ON DUPLICATE KEY UPDATE 達到以上目的, 且能保證操作的原子性和資料的完整性。
ON DUPLICATE KEY UPDATE 可以達到以下目的:
向資料庫中插入一條記錄:
若該資料的主鍵值/ UNIQUE KEY 已經在表中存在,則執行更新操作, 即UPDATE 後面的操作。
否則插入一條新的記錄。
示例:
Step1 . 建立表,插入測試資料
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for mRowUpdate
-- ----------------------------
DROP TABLE IF EXISTS `mRowUpdate`;
CREATE TABLE `mRowUpdate` (
`id` int(11) NOT NULL,
`value` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- ----------------------------
-- Records of mRowUpdate
-- ----------------------------
INSERT INTO `mRowUpdate` VALUES ('1', 'sss');
INSERT INTO `mRowUpdate` VALUES ('2', 'szh');
INSERT INTO `mRowUpdate` VALUES ('3', '9999');
SET FOREIGN_KEY_CHECKS=1;
Step2 .測試 ON DUPLICATE KEY UPDATE 的使用方法:
INSERT INTO mRowUpdate(id,`value`) VALUES(3, 'SuperMan') ON DUPLICATE KEY UPDATE `value`='SuperMan';
Step3. 查詢資料的變化情況
========================== 話外篇 ===============================
技巧:
技巧 1 :
ON DUPLICATE KEY UPDATE 特別適用於多行插入。如:
INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);
Tips: VALUES()函式只在INSERT…UPDATE語句中有意義,其它時候會返回NULL。
注意事項:
注意 1:
若多個索引都衝突,則只有一條記錄被修改。
create table test(
id int not null primary key,
num int not null UNIQUE key,
tid int not null
)
為了測試兩個唯一索引都衝突的情況,然後插入下面的資料
insert into test values(1,1,1), (2,2,2);
然後執行:
insert into test values(1,2,3) on duplicate key update tid = tid + 1;
因為a和b都是唯一索引,插入的資料在兩條記錄上產生了衝突,然而執行後只有第一條記錄被修改
id int not null primary key,
num int not null UNIQUE key,
tid int not null
)
為了測試兩個唯一索引都衝突的情況,然後插入下面的資料
insert into test values(1,1,1), (2,2,2);
然後執行:
insert into test values(1,2,3) on duplicate key update tid = tid + 1;
因為a和b都是唯一索引,插入的資料在兩條記錄上產生了衝突,然而執行後只有第一條記錄被修改
相關文章
- on duplicate key update簡單使用
- MySQL insert on duplicate key update 死鎖MySql
- BUG: pymysql executemany不支援insert on duplicate key updateMySql
- MySQL 關於 INSERT INTO...ON DUPLICATE KEY UPDATE 的使用MySql
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- 翻譯:insert on duplicate key update(已提交到MariaDB官方手冊)
- ERROR 1062 (23000): Duplicate entry for key 'PRIMARY'Error
- Window Application has "update" key wordsAPP
- MYSQL報1022錯誤:Can't write;duplicate key in table '.....'MySql
- Java中List集合轉Map集合報錯:Duplicate keyJava
- DUMP-CX_SY_OPEN_SQL_DB-DBSQL_DUPLICATE_KEY_ERRORSQLError
- Q:[Vue warn]: Duplicate keys detected: ‘PAYACT‘. This may cause an update error.VueError
- vue報錯之Duplicate keys detected: '0'. This may cause an update error.VueError
- sql查詢更新update selectSQL
- CocoaPods pod install/pod update更新慢
- MySQL更新資料,如何使用updateMySql
- 帝國CMS後臺新增資訊報錯Duplicate entry xx for key PRIMARY
- MySQL_踩坑記錄MySql
- .NET 資料庫大資料 方案(插入、更新、刪除、查詢 、插入或更新)資料庫大資料
- mybatis 批量新增insert、更新update詳解MyBatis
- fabirc error authorizing update: error validating ReadSet: readset expected key [Group] /Channel/AppErrorAPP
- 今天測試了一下update partition table的part key
- percona-toolkit之pt-index-usage和pt-duplicate-key-checker詳解Index
- 從ERROR 1062 (23000) at line Duplicate entry 'R01' for key 'PRIMARY' 能看出什麼Error
- MySQL_殺mysql執行緒MySql執行緒
- 深入React的生命週期(下):更新(Update)React
- Oracle\MS SQL Server Update多表關聯更新OracleSQLServer
- win10 windows update更新失敗怎麼解決 win10系統update更新失敗如何修復Win10Windows
- PHP配上MySQL實現批量更新插入PHPMySql
- MySQL中SELECT+UPDATE併發更新問題MySql
- hisql orm update表資料更新文件SQLORM
- MYSQL資料插入和更新的語法MySql
- PostgreSQL 插入時間與更新時間(qbit)SQL
- Babylon-AST初探-程式碼更新&刪除(Update & Remove)ASTREM
- Mysql跨表更新 多表update sql語句總結MySql
- Unfolder使用教程:如何插入,刪除和更新物件物件
- 【typeorm】typeorm官方文件querybuilder插入更新刪除部分ORMUI
- 【VMware vCenter】使用Reduced Downtime Update (RDU)升級更新vCenter Server。Server