• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    关于避免MySQL替换逻辑SQL的坑爹操作详解

    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;

    表数据

    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。由于编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

    好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • 深入了解Mysql逻辑架构
    • MYSQL存储过程即常用逻辑知识点总结
    • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解
    • 详解MySQL执行原理、逻辑分层、更改数据库处理引擎
    • Mysql逻辑架构详解
    • 利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
    • MySql存储过程之逻辑判断和条件控制
    • MySQL 利用frm文件和ibd文件恢复表数据
    • MySQL使用binlog日志做数据恢复的实现
    • MySQL 基于时间点的快速恢复方案
    • MySQL5.7 mysqldump备份与恢复的实现
    • MySQL 逻辑备份与恢复测试的相关总结
    上一篇:Mysql5.7.17 winx64.zip解压缩版安装配置图文教程
    下一篇:MySQL中count(*)、count(1)和count(col)的区别汇总
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    关于避免MySQL替换逻辑SQL的坑爹操作详解 关于,避免,MySQL,替换,逻辑,