zoukankan      html  css  js  c++  java
  • 数据库主键冲突解决

    数据库主键冲突解决
    #

    参考: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,则重新生成主键,再次进行插入,直到完成插入操作!

  • 相关阅读:
    2019.6.20刷题统计
    36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量
    35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型
    34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程
    33 udp 域名 进程
    32 粘包 文件传输
    31 socket客户端. 服务器 异常 语法
    30 网络编程
    29 元类 异常
    26 封装 反射 常用内置函数
  • 原文地址:https://www.cnblogs.com/xzwblog/p/7047849.html
Copyright © 2011-2022 走看看