`
beliveAda
  • 浏览: 112594 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

解决项目中主键重复无法插入数据的问题

阅读更多
出现此问题是由于这样:表中之前有一些插入的数据,后期经别人导入数据,再次导入数据时出现如下问题:
    初步分析,是由于导入数据时,导入了自增的id,而数据库中自增的id始终停留在原始的那个值。印象中,小李同学曾经解决过此问题,是将开始自增的值由现在最大的值+1,即可解决。但苦于自己不是专业的数据库人员,也没有系统学习过这方面的知识。于是,先找了邱同学帮我解决。首先确定了确实是由于上述的情况造成的,则修改了表结构中自增字段的最小开始值,生成代码,然后开始commit。发现此处需要将数据先备份出来,然后再插入数据,才能解决此问题。如果数据库中数据量不大的情况下,这种解决办法还是可以的。但数据量大的情况下,光是导入数据就会很长时间。看来这不是最好的解决办法。于是乎,让系统慢慢的导数据。另外思考,db2应该会提供这种修改自增值开始的方法。于是我们继续查询资料。
    经查找,找到如下资料:
    对于自增序列(GENERATED by default)
  GENERATED by default可以直接通过一般的导入方式加载数据,不过有时候会有一点点小问题,自增序列没有进行分配,也就是说,原来表有50条记录,自增序列的下一次分配值为50,当你已经导入了1000条记录进去了,然后发现自增序列的下一次分配值还是为50,这种事不经常发生,但是偶尔会发生一次,比较郁闷的是,当表继续插入数据的时候,下一次分配就会发生冲突,尤其是如果自增建为主键的时候,会违反唯一约束。

  解决办法:首先找到这个序列分配的最大值,select max(id) from tablea;

  然后用下边这个命令,alter table tablea alter column restart with max(id)+1

    哈哈,终于找到这种解决办法。速度应该会比上一种解决办法快很对了吧。至少不用再次的插入数据。于是在下一张表中再次出现此问题时,使用如下的sql语句,“alter table QUESTIONNAIRE_RUBRIC_CL1 alter column RUBRIC_INST_ID SET GENERATED ALWAYS restart with 210;”,此语句一执行,那个速度真是超赞哦。看来以后再出现此种情况,就照此方法解决了。
     另外,在测试自增id是否连续自增时,发现id虽然是顺序自增,但会出现不连续的情况。经邱同学研究,发现建表时,使用了cache。
分享到:
评论

相关推荐

    MySQL数据库主键重复原因分析及处理.pdf

    3. 数据库操作不当:如果数据库操作不当,例如在插入数据时没有正确地检查主键值,可能会导致主键重复。 为了解决主键重复的问题,需要对数据库进行优化和调整,例如: 1. 重新设计数据库架构,以确保每个表的主键...

    完美解决Thinkphp3.2中插入相同数据的问题

    本文将详细探讨如何在ThinkPHP 3.2版本中处理插入重复数据的问题,以及MySQL中的两种解决方案——`ON DUPLICATE KEY UPDATE` 和 `REPLACE INTO`。 首先,我们需要理解问题背景。在使用ThinkPHP 3.2进行数据插入时,...

    数据主键和外键的错误总结

    正确地使用外键可以帮助维护数据的参照完整性,但在实践中也容易出现各种问题。 1. **悬挂外键**:当外键所引用的主键不存在时,这种外键就称为悬挂外键。这种情况会导致数据的不一致性和损坏。 - **解决方法**:...

    删除Access数据库中重复的数据

    7. **预防措施**:为了避免将来再次出现重复数据,可以在创建表时设定主键,主键字段的值必须唯一,这样Access就会自动阻止插入重复的记录。此外,还可以使用数据验证规则来限制输入,确保新数据的唯一性。 在实际...

    如何删除表中重复数据

    3. **从临时表向原表插入数据**: ```sql INSERT INTO original_table (SELECT * FROM temp_table); ``` 将`temp_table`中的数据重新插入到`original_table`中。 4. **清理临时表**: ```sql DROP TABLE temp...

    MySQL中如何处理重复数据(Duplicate)?

    该语句在插入数据时,如果遇到唯一键冲突(即主键或有唯一索引的字段),则会执行更新操作。示例: INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3) ON DUPLICATE KEY UPDATE col1 = new_val...

    SQLServer中防止并发插入重复数据的方法详解

    通过定义这些约束,数据库系统会在插入数据时自动检查重复,避免插入重复记录。 2. 插入时的条件查询 在插入数据时,可以利用条件查询来确保插入的数据不与现有数据冲突。例如,使用`INSERT INTO...SELECT`语句...

    MySQL 处理插入过程中的主键唯一键重复值的解决方法

    在MySQL数据库中,处理插入数据时遇到主键或唯一键重复的问题有多种策略。本文将详细讲解三种方法:IGNORE、ON DUPLICATE KEY UPDATE和REPLACE,它们都能有效地避免因键重复而导致的插入失败。 1. **IGNORE关键字**...

    MySql三种避免重复插入数据的方法

    它首先尝试插入数据,如果发现冲突,它会删除现有的行,然后插入新的行。这相当于先执行`DELETE`再执行`INSERT`。在同样的例子中,如果使用`REPLACE INTO`而不是`INSERT IGNORE`,值`(5, 'cc', 4)`将被删除,然后新...

    MySQL自增主键删除后重复问题

     设置一张MySQL表,表里有一个自增主键ID,往表里插入数据,假如插入数据之后表后一行的ID是100,我先删除这条ID为100的记录,然后重新启动服务器,按理说如果再往这个表里插入新的记录,新纪录的ID将为101,对吧...

    数据库主键的五种设计方法

    这种方法是采用 GUID,当然我是推荐主键还是字符型的,但值由 GUID 生成,GUID 是可以自动生成,也可以程序生成,而且键值不可能重复,可以解决系统集成问题,几个系统的 GUID 值导到一起时,也不会发生重复。...

    实例介绍删除数据库中重复数据的几个方法

    在数据库管理过程中,删除重复记录是一项常见的需求,特别是当数据库中存在大量的冗余数据时,这不仅浪费存储空间,还可能导致查询性能下降以及数据的一致性问题。本文将详细介绍两种常见的删除数据库中重复数据的...

    U8升级问题汇总

    2. **深入分析**:进一步对比演示账套与客户实际数据发现,`ID_Flt`字段的标识属性在演示账套中设置为“是”,而在客户数据中设置为“是(不适用于复制)”。 3. **解决方案**:将表`Rpt_FltDEF`以及与其关联紧密的...

    深入探讨SQL_Server_表的主键问题

    本文主要探讨了在MS SQL Server中遇到的主键设计问题及其解决方案。 首先,传统的主键设计通常基于业务逻辑,例如在销售系统中,销售单号可能是主表的主键,而在从表中则通过引用主表的主键来建立关联。如果业务...

    详解C#批量插入数据到Sqlserver中的四种方式

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引。GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值...

Global site tag (gtag.js) - Google Analytics