【问题标题】:Problems with a primary key sequence主键序列问题
【发布时间】:2015-05-03 18:20:51
【问题描述】:

向表单添加新数据时,我的主键序列增加 1。 但是,如果我要删除一个数据并用新数据替换它,那么序列将继续进行。

例如,由于之前删除的行,我的数据主键变为 1、2、3、4、5、6、10。

我希望这是有道理的。

【问题讨论】:

  • 是的,这是预期的行为。问题是什么? stackoverflow.com/questions/2285906/…
  • 我用的是oracle,不是mysql,这有关系吗?因为我无法让命令工作。 @span
  • @span 我收到错误 ORA-01735: invalid ALTER TABLE option
  • @Oliver 你能更新你的问题吗?在您的一个 cmets 中,您提到如何在 Oracle Forms 中显示主键值,在我看来,这似乎与您的问题完全无关。

标签: oracle sequence oracleforms


【解决方案1】:
Oracle 中的

SEQUENCE 值保证是唯一的,但您不能期望这些值形成一个没有任何间隙的连续序列。

即使您永远不会从表中删除任何行,您也可能会在某些时候看到间隙,因为序列值在不同事务之间被缓存(预先保留)。

【讨论】:

  • 很公平,您知道如何在 oracle 申请表上显示主键吗?它们以某种方式隐藏起来。
  • 关于 "SEQUENCE 值...保证是唯一的,..." ...除非对序列没有任何形式的操作,例如喜欢:ALTER SEQUENCE SEQ INCREMENT by -4;
  • ...并且它没有设置为循环。这一点是有效的,即使没有缓存,它们也不是无间隙的。
  • @Trinimon - 显然我们可以做一些愚蠢的事情来破坏序列。所以我们还需要主键约束。关键是,Oracle 序列的目的是生成唯一数字流,仅此而已。
  • @APC:只要可以选择做不合理的事情,它们就会发生。这是肯定的。所以更好的是你准备好了(并且知道)......;)
【解决方案2】:

它是一个数字序列,它不关心你是否使用了“当前值”。
与 MySQL 不同,在 Oracle 中,Sequence 不绑定到列,但它是一个单独的对象,您可以从中获取值(通过your_sequence.nextval)。为了处理唯一性,它不会收回价值并再次提供它们。

如果您总是希望通过删除得到一个密集的 ID-s 序列,您将不得不这样做

  • 重新排列 ID-s(阅读:更改比已删除行更新的行的 ID-s),或
  • 在不了解您的任务的情况下,我建议使用DENSE_RANK analytic function 来查询您的数据集,并将真实的(表内)ID 与行的排名分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2021-10-03
    相关资源
    最近更新 更多