一个说难不难的触发器

豆芽菜瓜 2006-07-06 06:23:54
一张表有A,B,C(varchar2),D,E几列,触发器在A,B插入值或者更新的时候会向C列中插入值,格式为0001,并且这个值是递增的,还有条件是D=E,D是唯一值,E有些数据会放对应的D的值.假如我把中间已经有值的数据删掉了,再向新数据C列插值的时候会出现空号,比如0001,0002,0003,我把0002删掉,再插入就变成0004了,怎样可以把中间的值给补上?重新排好序.
这个触发器该怎么写?
...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
豆芽菜瓜 2006-07-06
  • 打赏
  • 举报
回复
因为E是跟D对应着的,D的值唯一,所以E有很多重复的,当E跟D对不上的时候,这行的C就置为空,只有E跟D的某一值相同才会产生C,比如D某一值为D1,这行数据的E没有值,另外有10行数据的E都为D1(它们的D值不用去管),这时,这10行数据就要按0001这样的排列下来,但E的值是可变的,如果这些数据中E变为D2,那就要按D2的那些去排,所以中间会出现空号,想来想去觉得比较复杂.说实话我觉得这表设计得很垃圾,但只能这样,我没权利去修改表结构.哎~~头大了.有解决方法就行,先不用考虑效率,最好是只在触发器实现,或者加上过程也可.拜托了!~~
寒若辰 2006-07-06
  • 打赏
  • 举报
回复
还是不懂你说的是什么意思。E变了,C值为什么会没有了?如果不建新表,在触发器里面全表查询检索的话,效率可能会更低。
豆芽菜瓜 2006-07-06
  • 打赏
  • 举报
回复
补充一下,其实0002的值我不是删掉了,而是把它的E值给改变了,所以它就暂时没有了C值,假如我还要把它的E值给变成相等的D值,并且还有批量插入或者更新的其它数据,这样新建表好么?或者还有别的什么有效的办法没?
寒若辰 2006-07-06
  • 打赏
  • 举报
回复
我觉得效率最高的方法是另外建一张表,用来记录已经删掉的C值。然后在原来的表上建一个Before Delete触发器,把:OLD.C插入到这张表里面。

其他的条件都很好满足,就不写了。记着在建触发器的时候不要忘了把新建的记录表里面已经填上的C再删掉。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧