在 SAP HANA 中重置 AUTO_INCREMENT 字段
Reset AUTO_INCREMENT field in 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
效果很好。
但我想将此 ID 字段的 auto_increment 重置为“0”。
有人知道怎么做吗?
你应该使用通用序列。下面的代码应该足够了:
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;
如果您正在寻找每个程序的序列分配器,那么序列和 IDENTITY 列可能是错误的选择。
两者都保留最后保证的最高数字,以便与存储的数据保持一致。
如果这些数字实际上是易变的并且重复使用相同的数字并不重要,那么您应该自己生成数字序列。
一种方法是使用交叉连接、LIMIT 和 ROW_NUMBER() window 函数。
另一种选择是创建一个 table 函数,该函数 returns 一个 table 序列号:
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 个数字。
我在 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
效果很好。
但我想将此 ID 字段的 auto_increment 重置为“0”。 有人知道怎么做吗?
你应该使用通用序列。下面的代码应该足够了:
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;
如果您正在寻找每个程序的序列分配器,那么序列和 IDENTITY 列可能是错误的选择。 两者都保留最后保证的最高数字,以便与存储的数据保持一致。 如果这些数字实际上是易变的并且重复使用相同的数字并不重要,那么您应该自己生成数字序列。
一种方法是使用交叉连接、LIMIT 和 ROW_NUMBER() window 函数。 另一种选择是创建一个 table 函数,该函数 returns 一个 table 序列号:
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 个数字。