Sql 插入新行时如何从列中自动递增值

Sql 插入新行时如何从列中自动递增值,sql,oracle,Sql,Oracle,我知道这似乎与一些问题相似,但我希望我的问题不同 我使用Oracle数据库 我想使用 COMPUTED column and LAST_VALUE(column) + 1 因此,我有以下要求: ALTER TABLE schema.table ( ADD SK NUMBER ALWAYS AS (LAST_VALUE(SK)+1) ); 它就这么做了吗 或者我是否需要为每行句子添加一个,以满足我的自动增量需求 根据G00dy的评论进行编辑: 顺序如下: create sequence

我知道这似乎与一些问题相似,但我希望我的问题不同

我使用Oracle数据库

我想使用

 COMPUTED column and LAST_VALUE(column) + 1
因此,我有以下要求:

ALTER TABLE schema.table (

ADD SK NUMBER ALWAYS AS (LAST_VALUE(SK)+1)

);
它就这么做了吗

或者我是否需要为每行句子添加一个
,以满足我的自动增量需求

根据G00dy的评论进行编辑:

顺序如下:

create sequence SK_SEQUENCES
increment by 1
start with 1
  nomaxvalue
  minvalue 1
nocycle
order
keep;
下表:

create table schema.test(
isCurrent CHAR(10),
SK NUMBER
);     
如果我理解@g00dy的评论

我需要添加序列作为我的列
SK
的值

所以我有这个:

insert into schema.test(SK)
values (SK_SEQUENCES.nextval)
那好吧,它起作用了

但是当我向
isCurrent
列添加值时

SK
列上没有自动增量

我想,要实现自动增量,我需要创建一个触发器

也许我必须使用触发器/序列来修复我的问题,但我不想..

不,它不起作用

首先,语法是
始终生成的
,而不仅仅是
始终
,并且
添加
子句周围没有括号。但是,这仍然不起作用:

alter table demo
add sk integer generated always as (last_value(sk)+1);
在以下情况下失败:

ORA-30484: missing window specification for this function
因为
last\u value
是一个分析函数,需要作为查询的一部分,并具有类似
over(按xxx顺序按yyy划分)的窗口规范
。不能将分析函数用作列默认值

在Oracle 12.1中,您可以将标识列定义为:

alter table demo
add sk integer generated always as identity;
在早期的Oracle版本中,插入时需要指定sequence.nextval,或者创建一个触发器作为

create sequence sk_seq;

create or replace trigger demo_generate_sk_trg
before insert on demo for each row
begin
    :new.dummy := sk_seq.nextval;
end;
/

我认为您只需要创建一个序列,并使用:
sequence\u name.nexval
作为要插入的列的值。该序列只是序列号生成器,每次使用
.nextval
时,它在insert语句中用于生成连续的数字。在同一会话中,您可以使用
.currval
重新使用此值(仅在调用
.nextval
之后)。更多信息请点击此处:。希望这能有所帮助。@g00dy不带触发器的序列能起作用(插入新行时自动递增)?我会努力的,谢谢你的帮助。我可能会返回我的结果:-)创建序列时,不需要列出所有默认值
create_sequence sk_seq
就可以了。@WilliamRobertson好的,我会注意到,在旧版本中使用trigger而不是nextval有什么好处吗?我不确定你的意思-你用哪种方式都可以。如果您有多个
insert
语句,则触发器无需在多个
insert
语句中显式编码。