当前位置: 首页 > news >正文

MySQL数据库UUID()函数引起主键冲突问题

在mysql新增一条数据时,产生了主键冲突问题,错误如下:



在mysql库表新增一条数据后,会触发一个触发器,触发器会根据新增的数据,进行复制n条并存储在另外的一张表中。

触发器如下:

DROP TRIGGER
IF EXISTS insertMeterPlanToRoutTask;

CREATE TRIGGER insertMeterPlanToRoutTask AFTER INSERT ON biz_meter_plan FOR EACH ROW
BEGIN
INSERT INTO biz_meter_task (
    MTASK_ID,
    LOCKIN_TIME,
    MPLAN_ID,
    MTASK_ITEM,
    MTASK_NAME,
    MTASK_USER,
    MTASK_ESTATE,
    MTASK_CHECK,
    MTASK_PROPETY,
    MTASK_STIME,
    MTASK_ETIME,
    ISDELETED,
    MTASK_CREATE_ID,
    MTASK_CREATE_TIME,
    MTASK_CREATE_NAME,
    HASCHANGED,
    MTASK_CARRY_USER,
    MTASK_BUILD_ID
  ) SELECT
    REPLACE(uuid(),'-','')   AS MTASK_ID,
    NOW(),
    NEW.MP_ID,
    NEW.MP_STATION,
    NEW.MP_NAME,
    NEW.MP_ROLE,
    '126',
    /*任务的状态*/
    '-1',
    '-1',
    T_STARTTIME,
    T_ENDTIME,
    'N',
    NEW.MP_USER_ID,
    NOW(),
    NEW.MP_USER_NAME,
    'N',
    NEW.MP_CARRY_USER,
    NEW.MP_BUILD_ID
  FROM
    task_meter
  WHERE
    MT_ID = NEW.MP_ID;
END
初步检查触发器,没有发现任何的错误。但是你看下面的案例,就会明白这个触发器错误出现在那里:


上面的sql执行完成之后,生成了四个不同的uuid,但是当我们加上from table(随便一张数据库存在的表名)时:


每一列的数据都是一模一样,这就是我们导致我们插入数据的时候,发生了主键冲突的直接原因。

解决方案:

1.修改字段的长度,从32改成36,直接存储完整的uuid “c790c97c-0a27-11e7-93b9-00163e12046e“

2.如果不能修改长度,我们为了获取不重复的32位uuid,可采用下面的方式来获取32位的主键:

CONCAT(SUBSTR(REPLACE(uuid(),'-','') FROM 5 FOR 15),	SUBSTR(UUID_SHORT() FROM -17 FOR 17))
 
根据我实际的需求,我采用的是第二种:

DROP TRIGGER
IF EXISTS insertMeterPlanToRoutTask;

CREATE TRIGGER insertMeterPlanToRoutTask AFTER INSERT ON biz_meter_plan FOR EACH ROW
BEGIN
INSERT INTO biz_meter_task (
    MTASK_ID,
    LOCKIN_TIME,
    MPLAN_ID,
    MTASK_ITEM,
    MTASK_NAME,
    MTASK_USER,
    MTASK_ESTATE,
    MTASK_CHECK,
    MTASK_PROPETY,
    MTASK_STIME,
    MTASK_ETIME,
    ISDELETED,
    MTASK_CREATE_ID,
    MTASK_CREATE_TIME,
    MTASK_CREATE_NAME,
    HASCHANGED,
    MTASK_CARRY_USER,
    MTASK_BUILD_ID
  ) SELECT
    CONCAT(SUBSTR(REPLACE(uuid(),'-','') FROM 5 FOR 15),
				SUBSTR(UUID_SHORT() FROM -17 FOR 17))  AS MTASK_ID,
    NOW(),
    NEW.MP_ID,
    NEW.MP_STATION,
    NEW.MP_NAME,
    NEW.MP_ROLE,
    '126',
    /*任务的状态*/
    '-1',
    '-1',
    T_STARTTIME,
    T_ENDTIME,
    'N',
    NEW.MP_USER_ID,
    NOW(),
    NEW.MP_USER_NAME,
    'N',
    NEW.MP_CARRY_USER,
    NEW.MP_BUILD_ID
  FROM
    task_meter
  WHERE
    MT_ID = NEW.MP_ID;
END

以上是本人对这个问题的解决方案,技术不是很成熟,针对里面出现的问题,至今有些还没有弄明白,望大神们不吝赐教。


相关文章:

  • 01 Mybatis应用篇---Mybatis入门
  • 02 Mybatis应用篇---XML配置之properties 属性和settings 设置
  • 01 Mybatis源码篇---创建SqlSessionFactory对象
  • 03 Mybatis应用篇---XML配置之typeAliases 类型命名
  • 02 Mybatis源码篇---XML配置之properties 属性和settings 设置
  • JDBC --- java开发中jdbc连接数据库demo
  • MySQL --- MySQL的定时器和存储过程
  • 03 Mybatis源码篇---XML配置之typeAliases 类型命名
  • 04 Mybatis源码篇---XML配置之environments环境
  • 05 Mybatis源码篇---XML配置之mappers 映射器
  • 04 Mybatis应用篇---XML映射文件之select,insert,update,delete基础介绍
  • 05 Mybatis应用篇---XML映射文件之select,insert,update,delete实战
  • IntelliJ IDEA 和 Eclipse 常用快捷键
  • 基于Maven环境进行Spring集成CXF WebService框架
  • 01 Mybatis整合Spring 由于版本引起的BUG
  • [Vue CLI 3] 配置解析之 css.extract
  • [译]Python中的类属性与实例属性的区别
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • ES学习笔记(12)--Symbol
  • Linux链接文件
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Node + FFmpeg 实现Canvas动画导出视频
  • node.js
  • python_bomb----数据类型总结
  • vue数据传递--我有特殊的实现技巧
  • 从tcpdump抓包看TCP/IP协议
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何实现 font-size 的响应式
  • 如何选择开源的机器学习框架?
  • 算法之不定期更新(一)(2018-04-12)
  • 网络应用优化——时延与带宽
  • raise 与 raise ... from 的区别
  • 湖北分布式智能数据采集方法有哪些?
  • ​Linux·i2c驱动架构​
  • ​卜东波研究员:高观点下的少儿计算思维
  • #vue3 实现前端下载excel文件模板功能
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (9)目标检测_SSD的原理
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (java)关于Thread的挂起和恢复
  • (Python第六天)文件处理
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (六)软件测试分工
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (五)网络优化与超参数选择--九五小庞
  • (转)Google的Objective-C编码规范
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .Net core 6.0 升8.0
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET导入Excel数据