MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的幾種情況
在MySQL數據庫中,如果在insert語句后面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重復值,那么就會發生舊行的更新;如果插入的行數據與現有表中記錄的唯一索引或者主鍵不重復,則執行新紀錄插入操作。另外,ON DUPLICATE KEY UPDATE不能寫where條件。
示例:
create table kid_score( id tinyint unsigned not null, birth_day date not null, score int unsigned not null, primary key(id, birth_day) --唯一索引是由 id + birth_day 兩個字段組成 ) engine = InnoDB; --初始化數據 insert into kid_score(id, birth_day, score) values (1,'2019-01-15',10),(2,'2019-01-16',20);
 下面開始驗證執行INSERT ··· ON DUPLICATE KEY UPDATE語法的規則:如果你插入的記錄導致一個UNIQUE索引或者primary key(主鍵)出現重復,那么就會認為該條記錄存在,則執行update語句而不是insert語句,反之,則執行insert語句而不是更新語句。
1. 唯一索引重復
insert into kid_score(id, birth_day, score) values (1,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;結果:
 
2. 唯一索引不重復
insert into kid_score(id, birth_day, score) values (2,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;結果:
 
3. 唯一索引重復,插入完全相同數據
insert into kid_score(id, birth_day, score) values (2,'2019-01-16',20) ON DUPLICATE KEY UPDATE score = 20;結果:
 
4. 影響行數
需要注意的是:如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2,如果更新的數據和已有的數據一模一樣,則受影響的行數是0。
mysql> select * from kid_score; +----+------------+-------+ | id | birth_day | score | +----+------------+-------+ | 1 | 2019-01-15 | 10 | | 2 | 2019-01-16 | 20 | +----+------------+-------+ 2 rows in set-- 唯一索引重復,執行更新 mysql> insert into kid_score(id, birth_day, score) values (1,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50; Query OK, 2 rows affectedmysql> select * from kid_score; +----+------------+-------+ | id | birth_day | score | +----+------------+-------+ | 1 | 2019-01-15 | 60 | | 2 | 2019-01-16 | 20 | +----+------------+-------+ 2 rows in set-- 唯一索引不重復,執行插入 mysql> insert into kid_score(id, birth_day, score) values (2,'2019-01-15',30) ON DUPLICATE KEY UPDATE score = score + 50;Query OK, 1 row affectedmysql> select * from kid_score; +----+------------+-------+ | id | birth_day | score | +----+------------+-------+ | 1 | 2019-01-15 | 60 | | 2 | 2019-01-15 | 30 | | 2 | 2019-01-16 | 20 | +----+------------+-------+ 3 rows in set-- 唯一索引重復,應該執行更新,但更新值與原值相同 mysql> insert into kid_score(id, birth_day, score) values (2,'2019-01-16',20) ON DUPLICATE KEY UPDATE score = 20;Query OK, 0 rows affectedmysql> select * from kid_score; +----+------------+-------+ | id | birth_day | score | +----+------------+-------+ | 1 | 2019-01-15 | 60 | | 2 | 2019-01-15 | 30 | | 2 | 2019-01-16 | 20 | +----+------------+-------+ 3 rows in set總結
以上是生活随笔為你收集整理的MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 英语语法---感叹词详解
- 下一篇: 关于Redis配置主从复制踩到的坑,主机
