用navicat建表设定主键的唯一性以后,导入数据出现了问题。
实测中发现,录入模式选择的是添加,当源数据主键一列有重复值的时候重复值会报错不被录入,但是同时部分没有重复的数据同样也会遗漏。比如500条数据,其中200个是重复值,正常情况下应该录入300条数据,实测过程中正常录入的不到300条。
其实这个问题录入模式选择添加或更新似乎是可以解决的,但是极大的拖累了录入速度,特别是数据累积较多的时候,请问此问题产生的原因以及解决方式?

解决方案 »

  1.   

    这种情况, 导入时就不应该直接导入到目标表。
    添加一个过渡表 tmp, 导入数据到 tmp 表, 再将 tmp 表中的数据按条件插入到 目标表 即可:
    类似:
    INSERT INTO targetTable(c1,c2)
    SELECT c1,c2 FROM tmp AS a
    WHERE NOT EXISTS(
    SELECT * FROM targetTable AS b WHERE a.c1=b.c1 AND a.c2=b.c2 
    );
      

  2.   

    Quote: 引用 1 楼 yenange 的回复:

    这种情况, 导入时就不应该直接导入到目标表。
    添加一个过渡表 tmp, 导入数据到 tmp 表, 再将 tmp 表中的数据按条件插入到 目标表 即可:
    类似:
    [code=sql]INSERT INTO targetTable(c1,c2)
    SELECT c1,c2 FROM tmp AS a
    WHERE NOT EXISTS(
    SELECT * FROM targetTable AS b WHERE a.c1=b.c1 AND a.c2=b.c2 
    );还有一个疑问,所有操作相同的情况下,在插入步骤的最后一步的高级选项中,取消勾选“使用拓展插入语句”时,我不录入重复数据的要求能够达到,但是速度会被极大拖累。但是我看了一下拓展语句的原理似乎并不影响啊,为什么会产生这样两个不同的结果呢 ?
      

  3.   

    你按我在 #1 的做, 慢了再说。
    navicat 只是一个第三方的工具, 不需要在上面结结。