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

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

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

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


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

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

是的, 我有一个专门的EJB组件负责为所有项目生成主键。

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

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

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


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


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

主键生成的思路有点问题,从概率上来说,随机数也会重复,而且很多随机数生成算法有问题。
比较流行的方法是:
1.为每个表的主键预定一个值,该值应大于当前值,将这些数值保存在数据库或文件中,当然内存中也有一份。
2.每次insert之前将当前值+1,并且判断是否大于预定值(内存中的哪个),如果是,则更新预定值,也就是让它更大。
3.返回当前值

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

建议参考banq的代码。