将 Oracle 序列重置为 MIN VALUE = 1 和 STARTING 编号从 1
Reset Oracle Sequence to have MIN VALUE = 1 and STARTING number from 1
我在将 Oracle 序列重置为 MIN VALUE = 1 并且开始使用的下一个数字是 1 时遇到问题。
我已经看完了这个问题的答案:
How do I reset a sequence in Oracle?
create or replace procedure reset_seq( p_seq_name in varchar2 ) is
l_val number;
begin
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_val;
execute immediate
'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
' minvalue 0';
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_val;
execute immediate
'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
但是,问题是上面的代码正在重置最小值 = 0 的序列,下一个要使用的值是 2。
是否可以在重置完成后设置 min_value = 1,nextval 为 1?
我尝试设置它,但收到大致如下所示的错误:
The current value cannot be higher then Minimum Value.
谢谢!
Is it possible to set the min value = 1, and next val to be 1, after the reset is done?
您可以分两步完成:
- increment_by 值比序列的当前值小一。
- 将 increment_by 重置为 1。
逻辑是,你不应该将序列递减回零,因为你想要的最小值是1
, 所以, nextval 不能小于 minval.
例如,
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
SQL> ALTER SEQUENCE s INCREMENT BY -19 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
1
SQL> ALTER SEQUENCE s INCREMENT BY 1 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
2
SQL> SELECT min_value, increment_by FROM user_sequences WHERE sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
因此,min_value 和 increment_by 现在 reset 到 1
分别。在您再次将 increment_by 重置为 1
之前,nextvalue 只能为 1 一次。
因此,我没有看到您想要实现的任何实际用途。然而,它可以像上面演示的那样完成。
要在您的程序中实现上述逻辑,请执行以下操作:
设置
SQL> DROP SEQUENCE S;
Sequence dropped.
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
将您的程序修改为:
SQL> CREATE OR REPLACE PROCEDURE reset_seq(
2 p_seq_name IN VARCHAR2 )
3 IS
4 l_val NUMBER;
5 BEGIN
6 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
7 l_val := l_val - 1;
8 dbms_output.put_line('l_val = '||l_val);
9 EXECUTE IMMEDIATE 'alter sequence ' ||
10 p_seq_name || ' increment by -' || l_val || ' minvalue 1';
11 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
12 dbms_output.put_line('1st Nextval is '||l_val);
13 EXECUTE IMMEDIATE 'alter sequence ' || p_seq_name ||
14 ' increment by 1 MINVALUE 1';
15 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
16 dbms_output.put_line('2nd Nextval is '||l_val);
17 END;
18 /
Procedure created.
SQL> SET serveroutput ON
SQL> EXEC reset_seq('S');
l_val = 20
1st Nextval is 1
2nd Nextval is 2
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT min_value, increment_by FROM user_sequences where sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
正如我所说,我没有看到它有任何实际用途。您的 nextval 实际上只能从 2
开始使用。当它是 1
时,您需要再次执行 ALTER SEQUENCE 以将 increment_by 重置回 1
.
我在将 Oracle 序列重置为 MIN VALUE = 1 并且开始使用的下一个数字是 1 时遇到问题。
我已经看完了这个问题的答案: How do I reset a sequence in Oracle?
create or replace procedure reset_seq( p_seq_name in varchar2 ) is
l_val number;
begin
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_val;
execute immediate
'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
' minvalue 0';
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_val;
execute immediate
'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
但是,问题是上面的代码正在重置最小值 = 0 的序列,下一个要使用的值是 2。
是否可以在重置完成后设置 min_value = 1,nextval 为 1?
我尝试设置它,但收到大致如下所示的错误:
The current value cannot be higher then Minimum Value.
谢谢!
Is it possible to set the min value = 1, and next val to be 1, after the reset is done?
您可以分两步完成:
- increment_by 值比序列的当前值小一。
- 将 increment_by 重置为 1。
逻辑是,你不应该将序列递减回零,因为你想要的最小值是1
, 所以, nextval 不能小于 minval.
例如,
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
SQL> ALTER SEQUENCE s INCREMENT BY -19 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
1
SQL> ALTER SEQUENCE s INCREMENT BY 1 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
2
SQL> SELECT min_value, increment_by FROM user_sequences WHERE sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
因此,min_value 和 increment_by 现在 reset 到 1
分别。在您再次将 increment_by 重置为 1
之前,nextvalue 只能为 1 一次。
因此,我没有看到您想要实现的任何实际用途。然而,它可以像上面演示的那样完成。
要在您的程序中实现上述逻辑,请执行以下操作:
设置
SQL> DROP SEQUENCE S;
Sequence dropped.
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
将您的程序修改为:
SQL> CREATE OR REPLACE PROCEDURE reset_seq(
2 p_seq_name IN VARCHAR2 )
3 IS
4 l_val NUMBER;
5 BEGIN
6 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
7 l_val := l_val - 1;
8 dbms_output.put_line('l_val = '||l_val);
9 EXECUTE IMMEDIATE 'alter sequence ' ||
10 p_seq_name || ' increment by -' || l_val || ' minvalue 1';
11 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
12 dbms_output.put_line('1st Nextval is '||l_val);
13 EXECUTE IMMEDIATE 'alter sequence ' || p_seq_name ||
14 ' increment by 1 MINVALUE 1';
15 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
16 dbms_output.put_line('2nd Nextval is '||l_val);
17 END;
18 /
Procedure created.
SQL> SET serveroutput ON
SQL> EXEC reset_seq('S');
l_val = 20
1st Nextval is 1
2nd Nextval is 2
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT min_value, increment_by FROM user_sequences where sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
正如我所说,我没有看到它有任何实际用途。您的 nextval 实际上只能从 2
开始使用。当它是 1
时,您需要再次执行 ALTER SEQUENCE 以将 increment_by 重置回 1
.