Как сбросить автоинкрементное поле в MS SQL и Oracle?

Вот так:

DBCC CHECKIDENT (<Table_Name>, RESEED, 0)

А так можно получить последнее сгенерированное значение такого поля:

SqlCeConnection Сonnection = new SqlCeConnection();
Сonnection.ConnectionString = @"Data Source = |DataDirectory|\Test.sdf";
Connection.Open();
SqlCeCommand cmd = Сonnection.CreateCommand();
cmd.CommandText = "select @@identity"; // этот запрос выдаст последнее сгенерированное значение для столбца
object i = cmd.ExecuteScalar();
int r = System.Convert.ToInt32(i);

Так как в СУБД Oracle нет автоинкрементного поля, то прийдется сбрасывать последовательность, с помощью которой реализуется такая функциональность:

declare
sql_str       varchar2(500) := null;
cache_size    varchar2(30)  := null;
seq_curr_val  number        := 0;
min_value     number        := 0;
increment_by  number        := 0;
sequence_name varchar2(30)  := 'TEST_SEQ'; -- Вместо TEST_SEQ указать
-- имя нужной последовательности
begin
--
-- Получим значения для параметров последовательности
-- CACHE_SIZE, MIN_VALUE, INCREMENT_BY
sql_str := 'select case cache_size
when 0 then '' nocache ''
else '' cache ''||to_char(cache_size)
end,
greatest(min_value, 1),
increment_by
from user_sequences
where sequence_name = ''' || sequence_name||'''';
execute immediate sql_str into cache_size, min_value, increment_by;
--
-- Отключим кеширование последовательности
sql_str := 'alter sequence '|| sequence_name ||' nocache';
execute immediate sql_str;
--
-- Получим следующее значение из последовательности
sql_str := 'select '||sequence_name||'.NEXTVAL from dual';
execute immediate sql_str into seq_curr_val;
--
-- Изменим шаг инкремента последовательности на нужное значение
sql_str := 'alter sequence '||sequence_name||' increment by '||
to_char(min_value - seq_curr_val);
execute immediate sql_str;
--
-- и вернем значение последовательности в 1 (или в MIN_VALUE, если оно больше 1)
sql_str := 'select '||sequence_name||'.NEXTVAL from dual';
execute immediate sql_str into seq_curr_val;
--
-- Установим инкремент и кэширование последовательности в исходные значения
sql_str := 'alter sequence '||sequence_name||
' increment by ' ||increment_by ||cache_size; 
execute immediate sql_str;
end;

P.S. По материалам: http://sql.ru 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

Comments

Add comment


 

biuquote
  • Comment
  • Preview
Loading