防止MySQL替换逻辑SQL的坑爹操作51CTO博客 - 超凡娱乐

防止MySQL替换逻辑SQL的坑爹操作51CTO博客

2019年03月05日10时59分08秒 | 作者: 南蓉 | 标签: 贺磊,抵触,小明 | 浏览: 459

replace into和insert into on duplicate key 差异

replace的用法

当不抵触时相当于insert,其他列默认值
当key抵触时,自增列更新,replace抵触列,其他列默认值
Com_replace会加1
Innodb_rows_updated会加1

Insert 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;
</br>

表数据

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 1 | 贺磊 | 26 |
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
++-+-+
3 rows in set (0.00 sec)

replace into用法

root@127.0.0.1 (helei)> replace into helei1 (name) values(贺磊);
Query OK, 2 rows affected (0.00 sec)

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
| 4 | 贺磊 | 0 |
++-+-+
3 rows in set (0.00 sec)
root@127.0.0.1 (helei)> replace into helei1 (name) values(爱璇);
Query OK, 1 row affected (0.00 sec)

root@127.0.0.1 (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:

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
| 4 | 贺磊 | 0 |
| 5 | 爱璇 | 0 |
++-+-+
4 rows in set (0.00 sec)

root@127.0.0.1 (helei)> insert into helei1 (name,age) values(贺磊,0) on duplicate key update age=100;
Query OK, 2 rows affected (0.00 sec)

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
| 4 | 贺磊 | 100 |
| 5 | 爱璇 | 0 |
++-+-+
4 rows in set (0.00 sec)

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
| 4 | 贺磊 | 100 |
| 5 | 爱璇 | 0 |
++-+-+
4 rows in set (0.00 sec)

root@127.0.0.1 (helei)> insert into helei1 (name) values(爱璇) on duplicate key update age=120;
Query OK, 2 rows affected (0.01 sec)

root@127.0.0.1 (helei)> select * from helei1;
++-+-+
| id | name | age |
++-+-+
| 2 | 小明 | 28 |
| 3 | 小红 | 26 |
| 4 | 贺磊 | 100 |
| 5 | 爱璇 | 120 |
++-+-+
4 rows in set (0.00 sec)

root@127.0.0.1 (helei)> insert into helei1 (name) values(不存在) on duplicate key update age=80;
Query OK, 1 row affected (0.00 sec)

root@127.0.0.1 (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。因为编写时刻也很匆促,文中难免会呈现一些过错或许不精确的当地,不当之处恳请读者批评指正。

喜爱的读者能够点个赞来个重视,您的赞许和重视是对笔者持续发文的最大鼓舞与支撑!

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章