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 不会影响性能或其他任何东西,它只会伤害一些人的眼睛:)
我有一个脚本(可能会失败)包含多个插入,其中包括 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 不会影响性能或其他任何东西,它只会伤害一些人的眼睛:)