每次我的团队对我们的UAT环境进行数据刷新时,我们都会遇到oracle中“自动递增”列的问题它们会保留旧值,因此在发生新插入时会导致错误。我找到的唯一解决方案是使用
从test_table中选择test_SEQ.nextval;
直到下一个序列大于表格中的最大序列号。我有200多个表要更新,有更容易的原因吗?
由于 埃林
答案 0 :(得分:0)
更好的方法是删除序列并使用所需的START WITH值创建新序列。您可以生成DDL以动态执行此操作。
答案 1 :(得分:0)
检查以下sqlfiddle http://sqlfiddle.com/#!4/17345/1
由于sqlfiddle的限制,它不能完全正常工作,但这是实现它的功能:
create or replace function
reset_sequence(p_sequence_name varchar,
p_table_name varchar,
p_column_name varchar)
return integer is
v_temp integer;
v_sql varchar(2000);
begin
v_sql := 'select nvl(max('||p_column_name||'),0)+1 col_name from '||p_table_name;
execute immediate v_sql INTO v_temp;
v_sql := 'drop sequence '||p_sequence_name;
execute immediate v_sql;
v_sql := 'create sequence '||p_sequence_name||' start with '||v_temp;
execute immediate v_sql;
return v_temp;
end;
基本上,您调用此函数并传递模式名称,表名称和列名称,并将函数设置为正确的值。您可以放置一个开始/异常/结束块,以便在丢弃序列时忽略错误,以防它不存在,但所有这些只是结冰。如果需要,您还可以让它检测作为主键的列,但在Oracle中没有检测序列名称的实际方法。 你也可以制作一个程序版本,但我倾向于因为某种原因而喜欢函数。