【问题标题】:How to reset IDENTITY column in oracle to a new value如何将 oracle 中的 IDENTITY 列重置为新值
【发布时间】: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?

标签: oracle identity


【解决方案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 尝试使列成为标识列时。看来您只能调整现有标识列的设置,而不能将现有的非标识列转换为一个。
  • 正确。该语句用于重置序列值,而不是迁移列的行为。请参阅此示例grassroots-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 相同) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多