• 数据库主键冲突解决


    数据库主键冲突解决
    #

    参考:https://zhidao.baidu.com/question/681411103315116572.html?qbl=relate_question_3&word=������ͻ��ô����

    顺便介绍一种刚发现的解决360doc无法复制的问题:
    右击——查看源代码——全部复制——新建一个html文档,粘贴进去用浏览器打开即可

    新增数据的基本语法为:

    insert into + 表名 + [(字段列表)] + values (值列表);
    

    在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突。
    当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即忽略、更新或者替换。

    1. 忽略(推荐)

    insert ignore into
    

    遇主键冲突,保持原纪录,忽略新插入的记录。

    mysql> select * from device ;
    +-------+--------+-------------+
    | devid | status | spec_char   |
    +-------+--------+-------------+
    |     1 | dead   | zhonghuaren | 
    |     2 | dead   | zhong       | 
    +-------+--------+-------------+
    2 rows in set (0.00 sec)
    
    mysql> insert into device values (1,'alive','yangting');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    
    mysql> insert ignore  into device values (1,'alive','yangting');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from device ;
    +-------+--------+-------------+
    | devid | status | spec_char   |
    +-------+--------+-------------+
    |     1 | dead   | zhonghuaren | 
    |     2 | dead   | zhong       | 
    +-------+--------+-------------+
    2 rows in set (0.00 sec)
    

    可见 insert ignore into当遇到主键冲突时,不更改原纪录,也不报错

    2.替换

    replace into
    

    遇主键冲突,替换原纪录,即先删除原纪录,后insert新纪录

    mysql> replace  into device values (1,'alive','yangting');
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> select * from device ;
    +-------+--------+-----------+
    | devid | status | spec_char |
    +-------+--------+-----------+
    |     1 | alive  | yangting  | 
    |     2 | dead   | zhong     | 
    +-------+--------+-----------+
    2 rows in set (0.00 sec)
    

    3. 更新

    insert into ... ON DUPLICATE KEY UPDATE
    

    其实这个是原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。

    IF (SELECT * FROM where 存在) {
        UPDATE  SET  WHERE ;
    } else {
        INSERT INTO;
    }
    

    如:

    mysql> insert into device values (1,'readonly','yang') ON DUPLICATE KEY UPDATE status ='drain';
    Query OK, 2 rows affected (0.00 sec)
    

    上面语句伪代码表示即为

    if (select * from device where devid=1) { 
        update device set status ='drain' where devid=1 
    } else {
        insert into device values (1,'readonly','yang')
    }
    

    很明显,devid=1 是有的,这样就执行update操作

    mysql> select * from device ;
    +-------+--------+-----------+
    | devid | status | spec_char |
    +-------+--------+-----------+
    |     1 | drain  | yangting  | 
    |     2 | dead   | zhong     | 
    +-------+--------+-----------+
    2 rows in set (0.00 sec)
    

    测试表:

    CREATE TABLE `device` (
    `devid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    `status` enum('alive','dead','down','readonly','drain') DEFAULT NULL,
    `spec_char` varchar(11) DEFAULT '0',
    PRIMARY KEY (`devid`)
    ) ENGINE=InnoDB
    

    项目采用UUID作为主键的冲突解决

    在项目中,比如插入一条user信息,主键采用随机UUID的冲突解决。
    可以考虑采用第一种忽略的方式,当主键冲突,数据库插入语句的返回值为0,然后我们判断数据库插入的返回值,如果为0,则重新生成主键,再次进行插入,直到完成插入操作!

  • 相关阅读:
    如何定义开发完成?(Definition of Done)
    Git协同工作流介绍
    Git常用命令拾遗
    搭建基于Docker社区版的Kubernetes本地集群
    Mqtt学习指南
    JavaWeb 学习总结
    异常:org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    MySQL 插入中文错误:java.sql.SQLException: Incorrect string value:
    Servlet 中文乱码问题解析及详细解决方法
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/xzwblog/p/7047849.html
Copyright © 2020-2023  润新知