1

我有一个表,其中一个序列为每条记录添加了主 ID,现在第 3 条记录已被删除,我需要用 ID 3 将其重新插入,但由于该序列存在它不会让我这样做,有人可以建议吗?当我尝试插入时,我收到以下消息。

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

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

ORA-04088: 执行触发器 'owner.trigger_name' 期间出错

4

1 回答 1

4

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

看起来分配 ID 的触发器正在执行完整性检查,并在看到在插入过程中手动提供了一个值时引发了该异常。那是为了保护你自己,大概,它会阻止你输入一个高于当前序列号的值——这会在序列达到相同值时导致错误。(假设它是一个主键,或者至少有一个唯一的约束)。

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

alter trigger <trigger_name> disable;

...然后当你完成时:

alter trigger <trigger_name> enable;

但我只会在中断期间或至少可以保证此表上没有其他插入时才会这样做。禁用触发器时的任何插入都不会获得分配的 ID。他们也应该出错 - 再次假设它是主键或非空唯一键 - 但这仍然是不可取的。

如果您真的无法阻止其他插入,您可以(暂时)在没有完整性检查的情况下重新创建触发器,但即便如此,这也不是一件容易的事。

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

于 2013-10-14T11:17:51.030 回答