插入条目和忽略序列

时间:2013-10-14 11:12:23

标签: oracle insert sequence

我有一个表,其中一个序列为每个记录添加了主要ID,现在删除了记录号3,我需要将其插入ID为3,但因为序列存在它不会让我,任何人都可以建议?我尝试插入时收到以下消息。

  

ORA-20001:表序列号在内部提供;请不要包含插入SQL语句

     

ORA-06512 at:“owner.trigger_name”,第4行

     

ORA-04088:执行触发器'owner.trigger_name'

时出错

1 个答案:

答案 0 :(得分:4)

ORA-20001错误在用户定义的范围内,因此它是您自己的代码(或者应用程序的代码),它正在抱怨 - 它本身不是Oracle。

看起来分配ID的触发器正在进行健全性检查,并在看到插入期间手动提供了值时引发该异常。这可能是为了保护您自己,并且它会阻止您输入一个高于当前序列号的值 - 这会在序列达到相同值时导致错误。 (假设它是主键,或者至少有一个唯一约束)。

由于它来自您自己的应用程序代码,因此唯一的方法是识别和禁用从序列中分配ID值并抛出异常的触发器。

alter trigger <trigger_name> disable;

......然后当你完成时:

alter trigger <trigger_name> enable;

但是我只会在停电期间执行此操作,或者至少可以保证此表中没有其他插件。禁用触发器时的任何插入都不会分配ID。它们也应该出错 - 再次假设它是主键或非空的唯一键 - 但这仍然是不可取的。

如果你真的无法阻止其他插入,你可以(暂时)重新创建触发器而不进行健全性检查,但即便如此,这也不是轻易做到的。

当然,如果它是一个合成密钥,那么实际的密钥值应该无关紧要,在这种情况下,它应该很好地进行正常插入并为重新插入的行获取新的ID值。如果某个其他表具有对3的引用,则听起来您没有外键约束,这会阻止该行首先被删除。