数据库是sqlserver 刚开始主键自增方式为native,后来把数据库复制重新建了个测试库,结构数据和表完全一样,但是用这个库时,自增长就不好使了,不能自动生成主键Id,改成incremnet就可以,这是为什么,求原因?????高分相送……在线等候!!

解决方案 »

  1.   

    你新建的数据库如果再用自增长,那又是从1开始了,原来你已经用过了主键不是又使用一次了吧?你可以在新数据库中把增长的值的开始调高一点吧。你用increment,是因为它在获取主键值之前,会去数据库中查询出最大的主键号,然后,再加1。
      

  2.   

    increment
    主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
    一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
    将此值加1作为主键。native
    由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
    其中一种作为主键生成方式。个人认为,你测试库的数据时复制过来的,也就是说你的ID数据是复制的,并不是数据库自行判读采用identity生成的,所有当你插入数据的时候,数据库在采用identity无法识别你以前 的复制的数据,详细问题可以参考sqlserver主键自动增长原理。
      

  3.   

    对,如果用oracle,一般hibernate会在数据库中建一个序列。然后序列的值就是主键的值,
    而你是新的数据库且是复制过去的值,肯定是从最小值从新开始,而只是主键又已经存在。
    所以插入的时候会出现唯一约束的问题。同理,sqlserver也是同样的原理。
    而你改成了incremnet,incremnet应该是查询当前表主键的最大值+1的。
    一般情况下,自己可以写一个table,专门用来保存数据库主键,将生产的主键保存在这个table中
    每次添加条数据就去查询这个表的某条记录,然后将主键字段+1返回即可
    这种手动维护主键的方式最大的好处就是解决数据库集群、多库共存、数据库备份迁移等等问题
    不好的就是性能有些影响