Сбросить поле AUTO_INCREMENT в SAP HANA

У меня проблема с SAP Hana. Я создал table как:

create column table some_names
   (ID bigint not null primary key generated by default as IDENTITY,
   NAME nvarchar(30));

И я вставил несколько значений:

insert into some_names (name) values ('Huey');
insert into some_names (name) values ('Dewey');      
insert into some_names (name) values ('Louie');   

Проверять :

select * from some_names;

ID  NAME
1   Huey
2   Dewey
3   Louie

Это сработало отлично.

Но я бы хотел сбросить auto_increment этого поля идентификатора на «0». Кто-нибудь знает, как это сделать?


person KrasshX    schedule 04.07.2016    source источник
comment
Простой поиск в Google приводит к нескольким подходам - ​​пробовали ли вы какой-либо из них?   -  person vwegert    schedule 04.07.2016
comment
Спасибо за Ваш ответ. Дело в том, что я проверял в Google, но не нашел ничего, что могло бы мне помочь с этой задачей, и большинство результатов касалось других СУБД. :( Я тоже проверял на SO, но ничего не нашел.   -  person KrasshX    schedule 04.07.2016
comment
Вам нужно начинать с 0 с самого начала или перезапустить последовательность позже в какой-то момент времени?   -  person Shidai    schedule 04.07.2016
comment
Я хотел бы сбрасывать автоинкремент каждый раз, когда я выполняю хранимую процедуру (поэтому я бы хотел, чтобы моя первая строка хранимой процедуры была похожа на alter column ID set auto_increment=0... или что-то в этом роде), но я не знаю, как это сделать.   -  person KrasshX    schedule 04.07.2016
comment
Хорошо, я обнаружил, что auto_increment field - это sequence. Я могу отобразить свой текущий id, выполнив следующие действия:   -  person KrasshX    schedule 04.07.2016


Ответы (2)


Если вы ищете дозатор последовательностей для каждой процедуры, то последовательности и столбец IDENTITY, вероятно, неправильный выбор. Оба сохраняют последнее гарантированное наибольшее число, чтобы соответствовать сохраненным данным. Если числа на самом деле изменчивы и не имеет значения, что одно и то же число используется повторно, вам лучше пойти и сгенерировать числовую последовательность самостоятельно.

Один из способов - использовать перекрестные соединения, LIMIT и оконную функцию ROW_NUMBER (). Другой вариант - создать табличную функцию, которая возвращает таблицу последовательных чисел:

drop function genNo;
create function genNo (in num_rows bigint) returns table (NULLCOL BIGINT, SEQID BIGINT)
as

begin
    DECLARE NULLCOL  INTEGER ARRAY;
    NULLCOL [:num_rows] = NULL;

    result = UNNEST (:NULLCOL) WITH ORDINALITY AS ("NULLCOL", "SEQID");
    return :result;
end;

С помощью этого вы можете, например, бегать

select SEQID
from genNo (1000000)

чтобы получить 1000000 номеров в порядке возрастания.

person Lars Br.    schedule 06.07.2016

Вам следует придерживаться общей последовательности. И приведенного ниже кода должно хватить:

DROP SEQUENCE SEQ_A;
CREATE SEQUENCE SEQ_A START WITH 0 MINVALUE 0;  

DROP TABLE "TABLE_A";
CREATE COLUMN TABLE "TABLE_A" (
    ID BIGINT,
    NAME nvarchar(30));

INSERT INTO "TABLE_A" (ID,NAME) VALUES (SEQ_A.NEXTVAL,'Shidai');
INSERT INTO "TABLE_A" (ID,NAME) VALUES (SEQ_A.NEXTVAL,'KrasshX');  
SELECT * FROM "TABLE_A";
ALTER SEQUENCE SEQ_A RESTART WITH 0;
person Shidai    schedule 04.07.2016
comment
Этот подход работает, только если только один сеанс использует последовательность в любой момент времени. Как только последовательность остановится на двух или более сессиях, ни одна из сессий не получит ожидаемых чисел. - person Lars Br.; 06.07.2016