朋友换一个软件,我帮他把以前的数据导到这个软件里,其实只有商品这个表,商品这个表里有一列id,不是标识列,是int型的,我用软件随便增加了两条,生成的两条id是1和2,我后面导的时候就从3算了,导了5000条,最大的id就是5002,格式也一样,导好后再用软件增加,结果提示主键重复了,因为软件只认得刚的那两条,这条该生成3,但导的时候3已经存在的,我一只以为软件是取的最大id+1,但其实不是,想问大家下,如果这个软件是你做的,那么这个id到底从哪取的?
   补充一点,用软件增加,要增加成功后id才会加1,不像标识列一样不管成功与否都加1,我原本以为在数据库的某列有存着这个id,只须改了5002就行了,但没找到,表太多了

解决方案 »

  1.   

    没太明白
    是我的话,取max(id)的值,然后+1,再插入
      

  2.   

    3楼说的有道理。。不过一般也就是通过MAX来获取吧。。我个人觉得哈。。他这个软件做的次了。。每次都是从第一个开始增加。。或者有设置的。。你没看见罢了
      

  3.   

    我以前也是认为取最大id+1的,但这样看来不是这样的,触发器应该没有吧,我总觉得是存在哪里的,但太多了,找不到,有没有更快捷的方法
    还有,那列id的类型是自定义的类型 
      

  4.   

    用一个东西来存最大id,会是数据库里的列吗,还是会在txt或xml文件里呢?
      

  5.   

    “最大的id+1”?自己看看google结果:http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&rlz=1I7GGLD_zh-CN&q=sql+server+identify&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN%7Clang_zh-TW&aq=f&aqi=&aql=&oq=&gs_rfai=
      

  6.   

    或者 http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&rlz=1I7GGLD_zh-CN&q=sql+server+identity&meta=lr%3Dlang_zh-CN%7Clang_zh-TW&aq=f&aqi=g3g-gs1g6&aql=&oq=&gs_rfai=这个编号当然会空出许多位置,并不是永远连续的。不过,通过DBCC可以重新设置起始编号,比如把5002改为从1重新开始编号。应该自己去找本SQL Server正规的开发书籍看看。
      

  7.   

    我觉的问题应该出在软件上。既然Id不是标识的,Id肯定是在增加的时候传参进去的,因为Id是主键,添加时是不能传空值的。软件肯定保存了上次增加成功后的Id值,执行增加时把原来的Id加一。而不是想楼主所说的增加成功后才加1。
      

  8.   

    保存Id有两种可能:
    1、全局的临时变量:软件每次启动时查询表里的最大Id,然后保存。如果这样你软件重启之后就可以执行添加了。
    2、保存到数据库了:每次执行添加时从表里取出当前最大Id,加1之后执行添加。添加成功在更新对应的Id记录。
    我想软件应该是第二种做法。如果有源码,去源码里一看就可以知道了。如果没有,请楼主耐心找找,应该可以找到的