【问题标题】:Modify Ids on delete Oracle trigger在删除 Oracle 触发器时修改 ID
【发布时间】:2015-06-02 01:55:30
【问题描述】:
ID VALUE
0   2
1   3
2   0

当第一个 id 为 0 的记录被删除时,第二个应该变成 0,第三个应该是 1。

导致:

ID VALUE
0   3
1   0

当 id 为 1 的记录被删除时,第三个应该变成 1 。

ID VALUE
0   2
1   0

哪一个被删除,连续的顺序应该从0开始保持。

这个 id 不是主键。应该在触发器中删除。

【问题讨论】:

  • 如果没有一些笨拙的解决方法,您不能让触发器修改触发器正在执行的同一表中的其他记录(变异触发器)。最好写一个存储过程来封装逻辑。
  • “应该在触发器中删除” 这是一个荒谬的要求,比如说……老师?请注意,家庭作业在 SO 中是明确允许的。没有什么不妥。但知道这可能有助于我们为您指明正确的方向,而不会浪费任何人的时间。
  • 您是否只是为了显示目的而使 then 连续?

标签: oracle triggers


【解决方案1】:

不要在触发器中修改同一个表,你会遇到变异表问题。

另一种方法是使用存储过程并在删除记录后调用它。只需选择所有大于已删除 ID 的 ID,然后从中减去 1。

PROCEDURE UPDATE_IDS(deletedID in Number) IS
  BEGIN
    UPDATE table t
    SET ID = ID - 1
    WHERE ID > deletedID;
END UPDATE_IDS;

【讨论】:

  • 这行得通。谢谢。但是你能告诉我一次删除多个 id 时必须做什么。 ID 可以是随机的。比如 0 和 16 或 23 和 27 和 29。
  • 只需遍历已删除的 id 数组即可为每个数字调用一次 proc
  • 但是 Ids 将在 for 循环的第一次迭代中被修改。在第二次迭代中,它将删除错误的 id。
  • 是的,所以按照从最大到最小的相反顺序进行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多