關於避免MySQL替換邏輯SQL的坑爹操作詳解

2022-09-26 11:51:15 字數 4168 閱讀 7570

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加了索引的啊,怎麼還...