精华内容
下载资源
问答
  • 数据库主键冲突解决

    2021-01-21 04:43:43
    数据库主键冲突解决#顺便介绍一种刚发现的解决360doc无法复制的问题:右击——查看源代码——全部复制——新建一个html文档,粘贴进去用浏览器打开即可新增数据的基本语法为:insert into + 表名 + [(字段列表)] + ...

    数据库主键冲突解决#

    顺便介绍一种刚发现的解决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,则重新生成主键,再次进行插入,直到完成插入操作!

    展开全文
  • 主从复制原理: 1.master的增删改记录写入binlog;...主主结构:两个节点既是主节点,又是从节点主主复制主键冲突:A节点插入了一条主键为4的数据,这条数据要同步到B节点,但是B节点存在了主键为4的数据,这时候...

    主从复制原理:

    826977974263e14291f26500fc0ad403.png

    1.master的增删改记录写入binlog;

    2.slave的I/O Thread(负责读取master的binlog)读取binlog并将记录写入relaylog;

    3.slave的sql thread读取relaylog同步到库;

    主主结构:两个节点既是主节点,又是从节点

    主主复制主键冲突:A节点插入了一条主键为4的数据,这条数据要同步到B节点,但是B节点存在了主键为4的数据,这时候就会失败!

    解决:

    让1台服务器  1,3,5,7来增长

    另1台服务器  2,4,6,8来增长

    一台服务器:

    set global auto_increment_increment = 2;  // 全局

    set global auto_increment_offset = 1;

    set session auto_increment_increment = 2; //当次连接

    set session auto_increment_offset = 1;

    另一台服务器:

    set global auto_increment_increment = 2;

    set global auto_increment_offset = 2;

    set session auto_increment_increment=2;

    set session auto_increment_offset = 2;

    有几台服务器,auto_increment_increment就设置几,比如3台服务器,auto_increment_increment=3,  3台服务器的auto_increment_offset依次开始为,1,2,3

    展开全文
  • mysql双主避免主键冲突解决方案 例如A-B MySQL互为主从 我们让MySQL A 主键ID自增的数值为奇数 Mysql B主键ID自增的数值为偶数,这样就可以避开冲突了 配置方式 mysql A # vim /etc/my.cnf auto_increment_...

    mysql双主避免主键冲突解决方案

    例如A-B MySQL互为主从
    我们让MySQL A 主键ID自增的数值为奇数 Mysql B主键ID自增的数值为偶数,这样就可以避开冲突了

    配置方式

    mysql A
    	# vim /etc/my.cnf
    	auto_increment_increment=2  pos每次自增的加的值
    	auto_increment_offset=1     pos的起始值
    
    	ID自增:1、3、5、7、9
    
    
    mysql B
    	# vim /etc/my.cnf
    	auto_increment_increment=2  pos每次自增的加的值
    	auto_increment_offset=2     pos的起始值
    
    	ID自增: 2、4、6、8
    
    展开全文
  • 上一篇 mybatis的分布式主键冲突 中,我提到,解决方式有两种,第二种就是修改默认的雪花算法实现方式,让机器标志不重复。 1,分析idworker类 如下图所示,idworker类有一个initSequence方法,而雪花算法的机器标志...

    背景

    上一篇 mybatis的分布式主键冲突 中,我提到,解决方式有两种,第二种就是修改默认的雪花算法实现方式,让机器标志不重复。

    1,分析idworker类

    如下图所示,idworker类有一个initSequence方法,而雪花算法的机器标志就是由里面的两个参数workerId, datacenterId来组成的。所以,我们只需要自定义workerId, datacenterId这两个值,保证他们不完全一样,那么机器标志就不会重复了。
    在这里插入图片描述

    2,自定义workerId, datacenterId

    我们是在mybatisplus的配置类加载后去定义我们的workerId, datacenterId的值的。需要借助redis和redisson分布式锁。原理就是workerId, datacenterId会逐个递增,直到两个值都最大,然后都归零,重新开始。只要服务数量不大于900多,理论上重启就不会重复。而,事实上,我们的服务也就只有不到20个。所以这个方案是比较合适,并且简单的。

    @Configuration
    @EnableTransactionManagement
    @MapperScan("com.yundasys.tms.*.*.mappers")
    @Slf4j
    public class MybatisPlusConfig {
    
        @Autowired
        private TmsRedisUtils tmsRedisUtils;
    
        @Autowired
        private RedissonClient redisson;
    
        /**
         * 更换默认的idWorker
         */
        @PostConstruct
        public void changeIdWorker(){
            RLock lock = redisson.getLock(RedisKeyConstant.TMS_REDIS_LOCK_PREFIX + "id:worker");
            try{
                lock.lock();
                long workId = 0;
                long dataId;
                while(true){
                    //redis中取值
                    String workIdStr = tmsRedisUtils.get(RedisKeyConstant.TMS_WORK_INCREMENT);
                    if(workIdStr != null){
                        workId = Long.parseLong(workIdStr);
                    }
                    //判断值
                    dataId = tmsRedisUtils.incr(RedisKeyConstant.TMS_DATA_INCREMENT, 1);
                    if(dataId > 30){
                        tmsRedisUtils.set(RedisKeyConstant.TMS_DATA_INCREMENT,0);
                        workId = tmsRedisUtils.incr(RedisKeyConstant.TMS_WORK_INCREMENT, 1);
                        if(workId > 30){
                            tmsRedisUtils.set(RedisKeyConstant.TMS_WORK_INCREMENT,0);
                        }
                        continue;
                    }
                    break;
                }
                log.info("changeIdWorker workId:{},dataId:{}",workId,dataId);
                IdWorker.initSequence(workId,dataId);
            }finally{
                lock.unlock();
            }
        }
    }
    

    总结

    这只是提供一种实现的方式。当然,也可以有其他的实现方式,比如 上上一篇mysql和redis实现自定义序号生成

    展开全文
  • 主主复制时的主键冲突解决 设置my.cnf里面的2个参数auto_increment_increment,auto_increment_offset 让1台服务器 1,3,5,7来增长 另1台服务器 2,4,6,8来增长 一台服务器: set global auto_increment_increment =...
  • 2018-01-18 12:06:51[ERROR]-[Thread: qtp1002276202-29]-[com.jfinal.core.ActionHandler.handle()]: /ajax/subjectSelectcom.jfinal.plugin.activerecord.ActiveRecordException: ...
  • MySQL数据库解决主主复制主键冲突问题的设置方法,在MySQL的配置文件my.ini的mysqld中设置下面两个变量,可以解决主键冲突。auto_increment_offset =auto_increment_increment =最近发现在mysql主主复制的情况下,...
  • 故障描述percona5.6,mysqldump全备份,导入备份数据时报错Duplicate entry 'hoc_log99-item_log_27-PRIMARY-n_diff_pfx01' for key 'PRIMARY'故障原因查看了下这个主键应该是MySQL系统库下的系统表innodb_index_...
  • Caused by: ...
  • 但是因为mysql中没有将主键设为自增长,导致每次都会报主键冲突的错误,插入失败。 对于这个问题,就是灵活得改变一下。之前,我们一直用的是 insert into tableA select * frrom tableA 因此,现在我们修改为:...
  • 遇到开发多线程测试插入数据的时候发现主键冲突问题问题具体描述如下:--------------------------------------------------------------调用Procedure_insertProcedure_insertBeginCall procedure(获取流水号)...
  • 0、导读用LOAD DATA导入数据却一直提示主键冲突问题解决案例。1、问题描述有位学生遇到数据导入时一直提示1022主键冲突问题,而导入的数据明明完全没有任何冲突,百思不得其解,请我帮忙协查。下面是关于该问题现象...
  • MySQL数据的高级操作 之 主键冲突数据的高级操作数据的操作,无外乎 增删改查。新增数据的基本语法为:insert into + 表名 + [(字段列表)] + values (值列表);在数据插入的时候,假设主键对应的值已经存在,则插入...
  • UPDATE操作出现主键冲突错误,如果出现了这样的问题,你一定会感到匪夷所思!mysql> UPDATE `GC_Price` SET `Price` = '155.00', `OptTime` = '2013-07-01 16:12:36', `CRCode` = '0109' WHERE (PRID = 364706189)...
  • 08-解决主键冲突

    2021-09-02 17:11:00
    2、主键冲突解决方法: 如果因为某种错误操作导致两台服务器出现主键冲突:如 Last_SQL_Error: Could not execute Write_rows event on table demo1.test1; Duplicate entry '17' for key 'PRIMARY', Error_code: ...
  • 从内网测试库导出表的部分内容到线上也就比平时频繁多了,这时候可能会出现主键冲突:Error Code : 1062Duplicate entry '1' for key 'PRIMARY'总结下,三种解决方案来避免出错1.insert ignore into遇主键冲突,保持...
  • insert时出现主键冲突的处理方法

    千次阅读 2021-02-02 09:20:55
    使用"insert into"语句进行数据库操作时可能遇到主键冲突,用户需要根据应用场景进行忽略或者覆盖等操作。总结下,有三种解决方案来避免出错。测试表:CREATE TABLE `device` (`devid` mediumint(8) unsigned NOT ...
  • 搭建了个双主,突然想到如果表设置了自增主键的话,当业务同时向双库中插入一条数据,这时候情况是什么样子的呢?比如:主库A和主库B上的一个表数据为: 12 'ninhao' 。当业务同时写入数据后主库A的数据是13 'new ...
  • #{item.depId},#{item.flag},#{item.level},#{item.smsTemplateVar},#{item.systemName},#{item.mtime},#{item.ctime}) 以上是我的SQL语句,在多线程的请求下就会报主键冲突异常,并且并发量越大主键冲突异常就越...
  • 背景 我所在团队的一个项目是微服务架构,同一个服务,会部署多个实例。然后在项目中用的是mybatis的自带的分布式主键 ...当机器标志重复,那么雪花算法就会出现主键冲突的问题。 1,mybatis获取主键 可以看到,当标记
  • MySQL 复制 主键冲突

    2021-01-19 01:51:36
    看了下复制的问题,最明显的一个案例就是主键冲突,今天就看下这个问题什么原因会导致这个问题怎么规避这个问题一、什么原因导致网上最多的说就是:对于存在auto_increment字段或者unique索引字段,使用replace into...
  • 那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。 比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,540
精华内容 15,816
关键字:

主键冲突怎么解决