违反uniques的Oracle序列不一致



我有oracle表

CREATE TABLE TestTable
( 
order_number number NOT NULL,
customer_name varchar2(50) NOT NULL,
CONSTRAINT Order_Primary_key PRIMARY KEY (order_number)
);

以及插入数据的过程

CREATE PROCEDURE TestProcedure(customerName VARCHAR2) AS
orderNumber number;
BEGIN
select testSequnce.nextval into orderNumber from dual;
insert into TestTable(order_number, customer_name) values(orderNumber,customerName);
END;

让我们假设不同的用户正在使用同一个表。一个用户调用过程并插入数据:

100 First
101 First
102 First
103 First

第二次调用过程并开始插入

98 Second
99 Second
100 - Uniques violation.

如何处理?对nextval施加额外约束?它应该大于表中已经存在的id?

更新。

EXECUTE TestProcedure('data');
ALTER SEQUENCE testSequnce INCREMENT by -2;
select testSequnce.nextval from dual;
ALTER SEQUENCE testSequnce INCREMENT by 1;
EXECUTE TestProcedure('data');
EXECUTE TestProcedure('data');

然后它将抛出违反的唯一约束(%s.%s(。看起来它没有生成唯一的值。

如果您正在运行:

EXECUTE TestProcedure('data');
ALTER SEQUENCE testSequnce INCREMENT by -2;
select testSequnce.nextval from dual;
ALTER SEQUENCE testSequnce INCREMENT by 1;
EXECUTE TestProcedure('data');
EXECUTE TestProcedure('data');

难怪您会遇到违反约束的情况。

如果将增量更改为负值,则序列现在将返回越来越低的数字,而不管它之前是否给定了该值。

你已经要求序列这样做了,这不是错误,这不是序列的问题,这是你对序列做了什么的问题。

不要将序列更改为负数递增,这样就不会导致主键违反约束(当然,假设每个人都在使用该序列插入主键列(。

最新更新