数据库是sqlserver 刚开始主键自增方式为native,后来把数据库复制重新建了个测试库,结构数据和表完全一样,但是用这个库时,自增长就不好使了,不能自动生成主键Id,改成incremnet就可以,这是为什么,求原因?????高分相送……在线等候!!
解决方案 »
- 关于java
- 一个很急切的关于cookie的问题,请大家看看!
- hibernate初学者碰到的问题,请高手指教
- jsp连接sql server2000速度很慢,是驱动的原因吗?
- jsp 怎么实现展现表格模型
- 关于<div align=center><img height="300" src="imageout.jsp?title=test" width="400"></div>
- 【求教】利用JSP生成XML文档
- 在文件上传时,如果文件不存在大家时怎么提示的?
- select sum(..) from .. where .....是不是where 后的条件不符会也选出结果但,使用if(rs.next())却为真
- struts配制数据源中如何指定url编码?
- jsp中读取数据库空字段时,怎么在显示时不显示null而显示空白?
- jsp文件在何处引用javascript文件较好?
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。个人认为,你测试库的数据时复制过来的,也就是说你的ID数据是复制的,并不是数据库自行判读采用identity生成的,所有当你插入数据的时候,数据库在采用identity无法识别你以前 的复制的数据,详细问题可以参考sqlserver主键自动增长原理。
而你是新的数据库且是复制过去的值,肯定是从最小值从新开始,而只是主键又已经存在。
所以插入的时候会出现唯一约束的问题。同理,sqlserver也是同样的原理。
而你改成了incremnet,incremnet应该是查询当前表主键的最大值+1的。
一般情况下,自己可以写一个table,专门用来保存数据库主键,将生产的主键保存在这个table中
每次添加条数据就去查询这个表的某条记录,然后将主键字段+1返回即可
这种手动维护主键的方式最大的好处就是解决数据库集群、多库共存、数据库备份迁移等等问题
不好的就是性能有些影响