Oracle - 如何回滚多个插入中的序列

Oracle - How to rollback sequences inside multiple inserts

我有一个脚本(可能会失败)包含多个插入,其中包括 nextval as

insert into table a (id, value) (id_seq.nextval, 'value');
...

如果脚本失败并且我回滚插入,则序列不会回滚并且不会使用多个 ID

是否有最佳实践来避免 "losing" 序列中的多个插入 ID?

我在不同的上下文中发现了类似的问题

无法自动回滚序列。 和往常一样,你不需要那个。

ROLLBACK 适用于 DML。它消除了当前事务中发生的表中任何数据更改的影响。

ROLLBACK不能将序列值改成原来的值(事务启动时序列的值)

无论如何,Sequence只是一个递增的数字,如果它滑动了几个数字,您不会丢失任何宝贵的数据,直到并且除非您的项目需要一个连续的序列并且这是严格的要求。如果是这样,那么您必须找到其他解决方法。

您无法控制序列中的间隙。

干杯!!

无法设置现有序列的当前值。如果您需要更改序列的值(当前值),您必须 "increment it back" 或重新创建它。

"Incrementing back"(肮脏的解决方法):

-- current value is 100
ALTER SEQUENCE seq_x  INCREMENT BY -25;--number of wrong increments or max(id)-seq_x.nextval in a procedure
SELECT seq_x.NEXTVAL FROM dual; -increments by 1 step, in this case -25
-- -> new current value is 75
ALTER SEQUENCE seq_x INCREMENT BY 1;

重新创建它:

DROP SEQUENCE seq_x;
CREATE SEQUENCE seq_x INCREMENT BY 1 START WITH 75;-- desired start value
-- You need to reassign privileges, if some were given

如果您使用的是自动递增列,则可以使用

将其设置为 table 中的最高值
ALTER TABLE table_name MODIFY ID GENERATED ALWAYS AS IDENTITY (START WITH LIMIT VALUE);
-- customize as you need it, i.e. GENERATED BY DEFAULT instead of GENERATED ALWAYS

如果您出于任何原因总是需要最后一个值,则必须从给定的 table select MAX(id)。 但是:table 中缺少 id 不会影响性能或其他任何东西,它只会伤害一些人的眼睛:)