我有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');
难怪您会遇到违反约束的情况。
如果将增量更改为负值,则序列现在将返回越来越低的数字,而不管它之前是否给定了该值。
你已经要求序列这样做了,这不是错误,这不是序列的问题,这是你对序列做了什么的问题。
不要将序列更改为负数递增,这样就不会导致主键违反约束(当然,假设每个人都在使用该序列插入主键列(。