replace into和insert into on duplicate key 區別
replace的用法
當不衝突時相當於insert,其餘列預設值
當key衝突時,自增列更新,replace衝突列,其餘列預設值
com_replace會加1
innodb_rows_updated會加1
insewww.cppcns.comrt into …on duplicate key的用法
不衝突時相當於insert,其餘列預設值
當與key衝突時,只update相應字段值。
com_insert會加1
innodb_rows_inserted會增加1
實驗展示
表結構create table helei1(
id int(10) unsigned not null auto_increment,
name varchar(20) not null default '',
age tinyint(3) unsigned not null default 0,
primary key(id),
unique key uk_name (name)
)engine=innodb auto_increment=1
default charset=utf8;
表資料[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | 賀磊 | 26 |
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
+----+-----------+-----+
3 rows in set (0.00 sec)
replace into用法
[email protected] (helei)> replace into helei1 (name) values('賀磊');
query ok, 2 rows affected (0.00 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 0 |
+----+-----------+-----+
3 rows in set (0.00 sec)
[email protected] (helei)> replace into helei1 (name) values('愛璇');
query ok, 1 row affected (0.00 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 0 |
| 5 | 愛璇 | 0 |
+----+-----------+-----+
4 rows in set (0.00 sec)
replace的用法
當沒有key衝突時,replace into 相當於insert,其餘列預設值
當key衝突時,自增列更新,replace衝突列,其餘列程式設計客棧預設值
insert into …on duplicate key:
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 0 |
| 5 | 愛璇 | 0 |
+----+-----------+-----+
4 rows i程式設計客棧n set (0.00 sec)
[email protected] (helei)> insert into helei1 (name,age) values('賀磊',程式設計客棧0) on duplicate key update age=100;
query ok, 2 rows affected (0.00 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 100 |
| 5 | 愛璇 | 0 |
+----+-----------+-----+
4 rows in set (0.00 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 100 |
| 5 | 愛璇 | 0 |
+----+-----------+-----+
4 rows in set (0.00 sec)
[email protected] (helei)> insert into helei1 (name) values('愛璇') on duplicate key update age=120;
query ok, 2 rows affected (0.01 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 100 |
| 5 | 愛璇 | 120 |
+----+-----------+-----+
4 rows in set (0.00 sec)
[email protected] (helei)> insert into helei1 (name) values('不存在') on duplicate key update age=80;
query ok, 1 row affected (0.00 sec)
[email protected] (helei)> select * from helei1;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 2 | 小明 | 28 |
| 3 | 小紅 | 26 |
| 4 | 賀磊 | 100 |
| 5 | 愛璇 | 120 |
| 8 | 不存在 | 0 |
+----+-----------+-----+
5 rows in set (0.00 sec)
總結replace into這種用法,相當於如果發現衝突鍵,先做乙個delete操作,再做乙個insert 操作,未指定的列使用預設值,這種情況會導致自增主鍵產生變化,如果表中存在外來鍵或者業務邏輯上依賴主鍵,那麼會出現異常。因此建議使用insert into …on duplicate key。由於編寫時間也很倉促,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。
本文標題: 關於避免mysql替換邏輯sql的坑爹操作詳解
本文位址:
避免MySQL替換邏輯SQL的坑爹操作
replace into和insert into on duplicate key 區別 replace的用法 當不衝突時相當於insert,其餘列預設值 當key衝突時,自增列更新,replace衝突列,其餘列預設值 com replace會加1 innodb rows updated會加1 in...
MySQL中避免NULL的坑
當資料的值為null的時候,可能出現各種意想不到的效果,讓人防不勝防,我們來看看null導致的各種神坑,如何避免?下面對null進行總結 1 null作為布林值的時候,不為1也不為0 2 任何值和null使用運算子 或者 in not in any some all 返回值都為null 3 當in和...
MySQL鎖 InnoDB行鎖需要避免的坑
換了工作之後,接近半年沒有發部落格了 一直加班 emmmm.今天好不容易有時間,記錄下工作中遇到的一些問題,接下來應該重拾知識點了。因為新公司工作中mysql庫經常出現查詢慢,鎖等待,節點掛掉.等一系列問題。導致每個程式設計師頭都很大,一味抱怨 為什麼我就查一條資料這麼卡 我tm加了索引的啊,怎麼還...