Сбросить поле 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". Кто-нибудь знает, как это сделать, пожалуйста?

3 ответа

Решение

Если вы ищете распределитель последовательностей для каждой процедуры, то последовательности и столбец 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 номеров в порядке возрастания.

Вы можете создать таблицу столбцов с идентификатором столбца, используя параметр «СОЗДАВАТЬ ВСЕГДА КАК ИДЕНТИФИКАЦИЮ (МИНЗНАЧЕНИЕ 0 НАЧАТЬ С 0)», и тогда вы получите 0 в качестве первого значения в начале процесса. Затем, прежде чем снова запустить процесс, вы можете DROP свою таблицу, а затем заново создать ее снова, всегда получая один и тот же результат.

Вы должны пойти с общей последовательностью. И кода ниже должно хватить:

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;
Другие вопросы по тегам