MySQL insert into select 主键冲突解决方案

 更新时间:2024年06月27日 10:35:45   作者:搬运Gong  
本文主要介绍了MySQL insert into select主键冲突解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

场景

项目中,一张表里的基础数据,ID 是以 varchar 类型存入的,由于每年都会存在变动,在不改变历史数据的情况下,每年生产一份当年使用的数据,如果当年基础数据有变动,则改动当年的数据,往年历史数据不做变更,通过逻辑进行数据分隔。

方案

1、小批量数据

小批量数据,由于数据量少,通过 复制数据库中原数据生成 insert 脚本,使用 UUID 来处理了主键问题,如下:

INSERT INTO test_category (id, create_date, update_date, label, sort, type, value, year) VALUES (replace(uuid(),'-',''), now(), now(), '汽车', 1, 'category', 'automobile', '2021');

INSERT INTO test_category (id, create_date, update_date, label, sort, type, value, year) VALUES (replace(uuid(),'-',''), now(), now(), '手机', 2, 'category', 'phone', '2021');

...

因为数据量少,自己修改脚本也花不了多长时间,那么,如果数据量大,再这么写就不行了,需要处理成百上千,甚至更多的时候,要怎么做呢?

2、大批量数据

这里,我通过 UUID + 自增来实现,具体 SQL 如下:

INSERT INTO test_category (id, name, kind_id, sort, type, year)
select concat(left(replace(uuid(),'-',''),28),(@i:=@i+1)) as id, name, kind_id, sort, type,'2022' as year
from exhibits_dict_new edn
left join (select @i:=1000) as t on 1 = 1
where year = '2021';

需要注意,这里关联了一张临时自增表,即:(select @i:=1000) as t  这里定义的 1000 为从 1000 开始,每一条记录,自增 1,为了避免与原 ID 出现重复现象,使用了 UUID 函数生成新记录,并截取后重新进行自增拼接,这样,就完美的解决了使用 insert into select 在同一张表里进行数据插入时的 主键冲突问题。

3、备份表常用 SQL

-- 创建一张表结构、索引信息一模一样的  空表
create table test_category_bak like test_category;

-- 往新备份的表中,插入需要备份的数据  全量备份,也可以在后面加上 where 条件进行条件备份
insert into test_category_bak select * from test_category;


-- 复制表,包含表中的数据
create table table_name2 as select * from table_name1;

-- 只复制表,不包含数据内容
create table table_name2 as select * from table_name1 where 1=2;

到此这篇关于MySQL insert into select 主键冲突解决方案的文章就介绍到这了,更多相关MySQL insert into select 主键冲突内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • mysql中between的边界,范围说明

    mysql中between的边界,范围说明

    这篇文章主要介绍了mysql中between的边界,范围说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Mysql中zerofill自动填充的实现

    Mysql中zerofill自动填充的实现

    MySQL中的zero fill可以设置自动填充零,以便固定位数的数字能够保持一致的格式,本文就介绍了Mysql中zerofill自动填充,感兴趣的可以了解一下
    2023-09-09
  • MySQL存储过程的查询命令介绍

    MySQL存储过程的查询命令介绍

    这篇文章主要介绍了MySQL存储过程的查询命令介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • MySQL多实例的配置应用实例场景

    MySQL多实例的配置应用实例场景

    在一台服务器上,运行多个数据库服务,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务,这篇文章主要介绍了MySQL多实例的配置场景分析,需要的朋友可以参考下
    2021-12-12
  • mysql数据库存储过程之游标(光标cursor)详解

    mysql数据库存储过程之游标(光标cursor)详解

    这篇文章主要介绍了mysql数据库存储过程之游标(光标cursor)详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法

    weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法

    WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器,这篇文章主要介绍了weblogic服务建立数据源连接测试更新mysql驱动包,需要的朋友可以参考下
    2022-01-01
  • MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)

    MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)

    这篇文章主要介绍了MySQL中文汉字转拼音的自定义函数和使用实例,需要的朋友可以参考下
    2014-06-06
  • 几个MySQL高频面试题的解答

    几个MySQL高频面试题的解答

    这篇文章主要介绍了几个MySQL高频面试题的解答,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2021-01-01
  • MySQL深分页,limit 100000,10优化方式

    MySQL深分页,limit 100000,10优化方式

    MySQL中深分页查询因需扫描大量数据行导致效率低下,优化方法包括子查询优化、延迟关联、标签记录法和使用between...and...等,通过减少回表次数和范围扫描提升查询性能,覆盖索引帮助减少搜索次数,提升性能
    2024-10-10
  • MySQL中文拼音排序的问题与解决方案

    MySQL中文拼音排序的问题与解决方案

    这篇文章主要为大家详细介绍了MySQL中文拼音排序的问题和相关解决方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-09-09

最新评论