如何在插入新行时从列中自动增加值

时间:2018-06-19 09:02:08

标签: sql oracle

我知道它似乎与某些问题类似,但我希望我的不同。

我使用的是Oracle数据库

我希望使用

对列进行auto_increment
 COMPUTED column and LAST_VALUE(column) + 1

所以我有以下要求:

ALTER TABLE schema.table (

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

);

它只会那样做吗?

或者我是否需要添加FOR EACH ROW句子以符合我对auto_increment的需求?

编辑根据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

上没有auto_increment

我想,要使用auto_increment我需要创建一个触发器。

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

1 个答案:

答案 0 :(得分:2)

不,它不会工作。

首先,语法为<link rel="stylesheet" href="YourStylesheet.css"> ,而不仅仅是generated always,并且always子句周围没有括号。但是,这仍然没有成功:

add

失败了:

alter table demo
add sk integer generated always as (last_value(sk)+1);

因为ORA-30484: missing window specification for this function 是一个分析函数,需要成为查询的一部分并具有类似last_value的窗口规范。您不能将分析函数用作列默认值。

从Oracle 12.1开始,您可以将标识列定义为:

over (partition by xxx order by yyy)

在早期的Oracle版本中,您需要在插入时指定sequence.nextval,否则创建触发器

alter table demo
add sk integer generated always as identity;