防止在oracle数据库中两次插入相同的值

时间:2012-04-05 17:06:59

标签: php oracle plsql

我有一个以这种形式的数字:2012-01(2012年为当前年份),01只是我数据库中字段的最大值加1,每年该数字重置为0。

但如果有两个用户尝试同时执行相同的操作,则两者的值相同,因此我在数据库中插入两次相同的数字。

我想创建一个序列,但是这需要一个每年重置序列的工作,我宁愿在我得到下一个数字之前有办法锁定 插入完成后释放它?

感谢。

2 个答案:

答案 0 :(得分:5)

CREATE UNIQUE INDEX index_name ON table_name(column_name);

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(column_name);

答案 1 :(得分:2)

您没有指定存储用作计数器的字段的位置。但也许可以使用SELECT FOR UPDATE语句。

在将计数器字段的值增加1之前,您可以使用SELECT FOR UPDATE锁定该记录。然后更新计数器。

这样的事情,假设表只有1条记录:

SELECT *  
FROM   CounterTable
FOR UPDATE;

UPDATE CounterTable
SET    Counter = Counter + 1;

COMMIT;

如果一个会话(用户)已完成SELECT FOR UPDATE但尚未提交或回滚,则执行SELECT FOR UPDATE的其他会话(用户)将阻止等待获取锁定。这可以防止两个用户获得相同的号码。