Mau*_*uli 159 sql database oracle sequence
在PostgreSQL中,我可以这样做:
ALTER SEQUENCE serial RESTART WITH 0;
Run Code Online (Sandbox Code Playgroud)
是否有Oracle等价物?
Dou*_*ter 142
这是从Oracle大师Tom Kyte将任何序列重置为0的好方法.关于以下链接的利弊也有很好的讨论.
tkyte@TKYTE901.US.ORACLE.COM>
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;
/
Run Code Online (Sandbox Code Playgroud)
从此页面:动态SQL重置序列值
另一个很好的讨论也在这里:如何重置序列?
Mo.*_*Mo. 89
AFAIK无法真正重启.(如果我错了,请纠正我!).
但是,如果要将其设置为0,则只需删除并重新创建它即可.
如果要将其设置为特定值,可以将INCREMENT设置为负值并获取下一个值.
也就是说,如果序列为500,则可以将其设置为100
ALTER SEQUENCE serial INCREMENT BY -400;
SELECT serial.NEXTVAL FROM dual;
ALTER SEQUENCE serial INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
小智 45
这是我的方法:
例:
--Drop sequence
DROP SEQUENCE MY_SEQ;
-- Create sequence
create sequence MY_SEQ
minvalue 1
maxvalue 999999999999999999999
start with 1
increment by 1
cache 20;
Run Code Online (Sandbox Code Playgroud)
All*_*ite 33
我的方法是对Dougman的例子的延伸.
扩展是......
将种子值作为参数传递.为什么?我喜欢调用将序列重置为某些表中使用的最大ID的东西.我最终从另一个脚本调用此proc,该脚本对一大堆序列执行多次调用,将nextval重置为某个级别,该级别足够高,不会导致主键违规,我将序列的值用于唯一标识符.
它也尊重以前的最小值.如果期望的p_val或现有的minvalue高于当前或计算的下一个值,它实际上可以推动下一个值更高.
最重要的是,可以调用它来重置为指定值,并等到你看到包装器"修复所有序列"程序结束时.
create or replace
procedure Reset_Sequence( p_seq_name in varchar2, p_val in number default 0)
is
l_current number := 0;
l_difference number := 0;
l_minvalue user_sequences.min_value%type := 0;
begin
select min_value
into l_minvalue
from user_sequences
where sequence_name = p_seq_name;
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_current;
if p_Val < l_minvalue then
l_difference := l_minvalue - l_current;
else
l_difference := p_Val - l_current;
end if;
if l_difference = 0 then
return;
end if;
execute immediate
'alter sequence ' || p_seq_name || ' increment by ' || l_difference ||
' minvalue ' || l_minvalue;
execute immediate
'select ' || p_seq_name || '.nextval from dual' INTO l_difference;
execute immediate
'alter sequence ' || p_seq_name || ' increment by 1 minvalue ' || l_minvalue;
end Reset_Sequence;
Run Code Online (Sandbox Code Playgroud)
该过程本身很有用,但是现在让我们添加另一个调用它并使用序列命名约定以编程方式指定所有内容并查找现有表/字段中使用的最大值...
create or replace
procedure Reset_Sequence_to_Data(
p_TableName varchar2,
p_FieldName varchar2
)
is
l_MaxUsed NUMBER;
BEGIN
execute immediate
'select coalesce(max(' || p_FieldName || '),0) from '|| p_TableName into l_MaxUsed;
Reset_Sequence( p_TableName || '_' || p_Fieldname || '_SEQ', l_MaxUsed );
END Reset_Sequence_to_Data;
Run Code Online (Sandbox Code Playgroud)
现在我们用煤气做饭!
上面的过程将检查表中字段的最大值,从表/字段对构建序列名称,并使用该感知的最大值调用"Reset_Sequence".
这个拼图中的最后一块和蛋糕上的锦上添花......
create or replace
procedure Reset_All_Sequences
is
BEGIN
Reset_Sequence_to_Data( 'ACTIVITYLOG', 'LOGID' );
Reset_Sequence_to_Data( 'JOBSTATE', 'JOBID' );
Reset_Sequence_to_Data( 'BATCH', 'BATCHID' );
END Reset_All_Sequences;
Run Code Online (Sandbox Code Playgroud)
在我的实际数据库中,通过这种机制重置了大约一百个其他序列,因此在上面的过程中还有97次调用Reset_Sequence_to_Data.
爱它?讨厌它?冷漠?
Jon*_*ler 32
alter sequence serial restart start with 1;
Run Code Online (Sandbox Code Playgroud)
此功能是Oracle 12c中的新功能.它未包含在官方文档中.我在Oracle软件包DBMS_METADATA_DIFF生成的脚本中找到了它.
警告:我在生产系统上多次使用过此功能,在我看来,在ad-hoc脚本中使用此命令是可以的.但您可能不希望将其作为应用程序的一部分包含在过程中.我创建了一个Oracle服务请求,询问此功能; 它不仅仅是一个文档错误,它是一个不受支持的功能.有一天命令可能会消失,比如说__CODE__.(虽然我认为这不太可能 - Oracle语法很少消失,而且它是一个在内部至少两个地方使用的简单功能.)
小智 9
以下脚本将序列设置为所需的值:
给定一个名为PCS_PROJ_KEY_SEQ和表PCS_PROJ的新创建的序列:
BEGIN
DECLARE
PROJ_KEY_MAX NUMBER := 0;
PROJ_KEY_CURRVAL NUMBER := 0;
BEGIN
SELECT MAX (PROJ_KEY) INTO PROJ_KEY_MAX FROM PCS_PROJ;
EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY ' || PROJ_KEY_MAX;
SELECT PCS_PROJ_KEY_SEQ.NEXTVAL INTO PROJ_KEY_CURRVAL FROM DUAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY 1';
END;
END;
/
Run Code Online (Sandbox Code Playgroud)
在 Oracle 中还有另一种重置序列的方法:设置maxvalue和cycle属性。当nextval序列的 命中 时maxvalue,如果cycle设置了该属性,那么它将再次从minvalue序列的 开始。
与设置负数相比,此方法的优点increment by是在重置过程运行时可以继续使用序列,从而减少需要采取某种形式的中断来进行重置的机会。
的值maxvalue必须大于 current ,因此下面的过程包含一个可选参数,允许在选择过程中的 和设置属性nextval之间再次访问序列时使用缓冲区。nextvalcycle
create sequence s start with 1 increment by 1;
select s.nextval from dual
connect by level <= 20;
NEXTVAL
----------
1
...
20
create or replace procedure reset_sequence ( i_buffer in pls_integer default 0)
as
maxval pls_integer;
begin
maxval := s.nextval + greatest(i_buffer, 0); --ensure we don't go backwards!
execute immediate 'alter sequence s cycle minvalue 0 maxvalue ' || maxval;
maxval := s.nextval;
execute immediate 'alter sequence s nocycle maxvalue 99999999999999';
end;
/
show errors
exec reset_sequence;
select s.nextval from dual;
NEXTVAL
----------
1
Run Code Online (Sandbox Code Playgroud)
保持不变的过程允许另一个会话获取值 0,这对您来说可能是也可能不是问题。如果是的话,您始终可以:
minvalue 1在第一个改变中设置nextval获取nocycle到另一个过程中,以便稍后运行(假设您想要执行此操作)。小智 5
此存储过程重新启动我的序列:
Create or Replace Procedure Reset_Sequence
is
SeqNbr Number;
begin
/* Reset Sequence 'seqXRef_RowID' to 0 */
Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
Execute Immediate 'Alter sequence seqXRef increment by - ' || TO_CHAR(SeqNbr) ;
Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
Execute Immediate 'Alter sequence seqXRef increment by 1';
END;
Run Code Online (Sandbox Code Playgroud)
/
小智 5
1)假设您创建一个如下所示的SEQUENCE:
CREATE SEQUENCE TESTSEQ
INCREMENT BY 1
MINVALUE 1
MAXVALUE 500
NOCACHE
NOCYCLE
NOORDER
Run Code Online (Sandbox Code Playgroud)
2) 现在您可以从 SEQUENCE 中获取值。假设我已获取四次,如下所示。
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
Run Code Online (Sandbox Code Playgroud)
3)执行完以上四个命令后,SEQUENCE 的值将为 4。现在假设我再次将 SEQUENCE 的值重置为 1。请按照以下步骤操作。按照相同的顺序执行所有步骤,如下所示:
ALTER SEQUENCE TESTSEQ INCREMENT BY -3;SELECT TESTSEQ.NEXTVAL FROM dualALTER SEQUENCE TESTSEQ INCREMENT BY 1;SELECT TESTSEQ.NEXTVAL FROM dual| 归档时间: |
|
| 查看次数: |
528001 次 |
| 最近记录: |