关于操作数据库时,主键或者唯一索引重复的判断

04-04-30 wildfox
请问各位,操作数据库时,主键或者唯一索引重复的判断是放在insert/update 之前还是应该放在insert/update 出现异常之后?

对于前者,肯定每次会做很多的无用功,而且也无法完全避免重复的问题,但是可以使重复发生的几率大大降低。

对于后者,异常发生以后,很难直接根据异常判断出是主键重复或者唯一索引重复,也只能去执行select 的操作,假如开始出现的异常是数据库或者网络出现了问题而导致的,那么再执行 select 等操作的时候将会消耗掉很多的时间。

不知各位大侠是如何处理这个问题的?

cats_tiger
2004-05-08 14:00
我们规定主键都是long或integer类型,采用统一的主键管理模块,这样保证不会在Insert时重复;Update的时候不会修改主键键值。

banq
2004-05-08 20:50
是的, 我有一个专门的EJB组件负责为所有项目生成主键。

wildfox
2004-05-09 13:38
我们产生主键采用比较长的随机数,冲突的可能性不大,但是对于不是主键约束,而是唯一索引约束的,在更新的时候就可能产生冲突

比如有这样一张表,存放专业信息

(专业ID, 专业名称, 学校ID)

专业ID 是主键, (专业名称,学校ID)为唯一索引

如果专业名称可以修改,那么在修改专业信息的时候,在同一个学校里就可能产生专业名称相同的冲突 当然一个insert 一个update 的时候也会产生这样的问题

cats_tiger
2004-05-11 17:00
主键生成的思路有点问题,从概率上来说,随机数也会重复,而且很多随机数生成算法有问题。

比较流行的方法是:

1.为每个表的主键预定一个值,该值应大于当前值,将这些数值保存在数据库或文件中,当然内存中也有一份。

2.每次insert之前将当前值+1,并且判断是否大于预定值(内存中的哪个),如果是,则更新预定值,也就是让它更大。

3.返回当前值

这样的好处是不必每次insert都执行类似这样的sql:select max(id) from...

建议参考banq的代码。

猜你喜欢