如何将 oracle 中的 IDENTITY 列重置为新值

Posted

技术标签:

【中文标题】如何将 oracle 中的 IDENTITY 列重置为新值【英文标题】:How to reset IDENTITY column in oracle to a new value 【发布时间】:2015-08-03 09:28:02 【问题描述】:

我正在使用 oracle 12 c 的 IDENTITY 功能来增加表的记录 ID。 作为初始设置的一部分,我们必须将一些记录从另一个系统迁移到此表。这些记录是非连续记录(部分记录被删除)。

如何使身份始终根据表记录创建最高value + 1

在谷歌搜索不同的选项后发现 RESTART WITH 值选项的关键字。为此,我们需要创建一个新的存储过程并更改所有具有最高可能值的表以重新启动。

是否有任何直接关键字可以与IDENTITY 一起使用,可以强制它始终重新生成更高的值。 ?

【问题讨论】:

RESTART WITH 功能不起作用,尽管在 oracle 文档中建议将其作为选项。唯一的选项似乎改变了表并强制 IDENTITY 从最大值+1 开始。 “restart with”不是oracle,可能是mysql 【参考方案1】:

这在 12c 中变得超级简单

alter table your_table modify (id generated by default on null as identity 
                               start with limit value);

然后下一个插入将使用已自动重置为本质上是 max(id)+1 的序列安全插入 https://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

【讨论】:

我总是得到 ORA-30673: column to be modified is not an identity column 尝试使列成为标识列时。看来您只能调整现有标识列的设置,而不能将现有的非标识列转换为一个。 正确。该语句用于重置序列值,而不是迁移列的行为。请参阅此示例gras-s-roots-oracle.com/2016/10/… 谢谢,斯科特!你让我开心!【参考方案2】:

没有直接关键字,您必须更改表(正确的单词是 START WITH)。 还有另一种方法可以更改标识列的高水位线。 至于常见的序列(顺便说一下身份是建立在系统序列上的),请使用 INCREMENT BY 的旧技巧在任何方向上移动标记。

ALTER TABLE T
MODIFY (ID NUMBER GENERATED ALWAYS AS IDENTITY
INCREMENT BY 50
NOCACHE);

也就是说,如果现在下一个值为 100 并且您需要将其设为 1000,则执行此技巧两次:“递增 900”,添加记录并返回“递增 1”(如果与步骤 1 相同) .

【讨论】:

以上是关于如何将 oracle 中的 IDENTITY 列重置为新值的主要内容,如果未能解决你的问题,请参考以下文章

休眠中的 GenerationType.AUTO 与 GenerationType.IDENTITY

Oracle中如何获取添加行的id

数据透视表列重命名

在 Oracle 12c 的 IDENTITY 列中通过 SQL * Loader 加载数据

如何使用 R 中的函数 sqlSave() 将数据附加到具有 IDENTITY 主键的 SQL Server 表中?

如何有条件地将多个模型映射到 ASP.NET Core Identity 中的一个表(AspNetUsers)?