甲骨文如何更改标识列的下一个自动生成的值

ol'*_*uts 4 oracle12c

我已经创建了表项目,如下所示:

CREATE TABLE projects (
  project_id NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY ,
  project_name VARCHAR2(75 CHAR) NOT NULL
Run Code Online (Sandbox Code Playgroud)

然后,我从旧的MySQL表导入数据时插入了约150,000行。MySQL具有我需要保留的现有ID号,因此我在插入过程中将ID号添加到了SQL中。现在,当我在oracle表中插入新行时,id是一个非常小的数字。您能否告诉我如何将project_id列上的计数器重置为从150,001开始,以免弄乱我现有的任何ID号?基本上我需要以下的oracle版本:

ALTER TABLE tbl AUTO_INCREMENT = 150001;
Run Code Online (Sandbox Code Playgroud)

编辑:Oracle 12c现在支持标识数据类型,允许使用不需要我们创建序列+插入触发器的自动编号主键。

解决方案:经过一些创造性的google搜索词后,我能够在oracle docs网站上找到线程。这是更改身份下一个值的解决方案:

ALTER TABLE     projects    MODIFY  project_id  GENERATED BY DEFAULT ON NULL AS IDENTITY ( START WITH   150000);
Run Code Online (Sandbox Code Playgroud)

Sen*_*try 6

根据这个来源,你可以这样做:

ALTER TABLE projects MODIFY project_id
    GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH LIMIT VALUE);
Run Code Online (Sandbox Code Playgroud)

START WITH LIMIT VALUE 子句只能使用 ALTER TABLE 语句指定(并且通过对现有标识列进行暗示)。指定此子句时,将扫描表以查找 PROJECT_ID 列中的最高值,并且序列将从该值 + 1 开始。

OP自己的答案中引用的oracle线程也说明了同样的情况:

START WITH LIMIT VALUE 特定于identity_options,只能与ALTER TABLE MODIFY 一起使用。如果指定 START WITH LIMIT VALUE,则 Oracle 数据库会锁定表并查找表中的最大标识列值(对于递增序列)或最小标识列值(对于递减序列),并将该值指定为序列生成器的高水位标记。序列生成器返回的下一个值将是高水位线 + INCRMENT BY 整数(对于递增序列)或高水位线 - INCRMENT BY 整数(对于递减序列)。


ol'*_*uts 5

这是我在此oracle线程上找到的解决方案。概念是更改标识列而不是调整顺序。实际上,自动创建的序列不可编辑或不可删除。

ALTER TABLE     projects    MODIFY  project_id  GENERATED BY DEFAULT ON NULL AS IDENTITY ( START WITH   150000);
Run Code Online (Sandbox Code Playgroud)