在 oracle 10g 中添加自动增量和自动减量列

Posted

技术标签:

【中文标题】在 oracle 10g 中添加自动增量和自动减量列【英文标题】:Add auto increment and auto decrement column in oracle 10g 【发布时间】:2012-09-12 08:46:52 【问题描述】:

我想在oracle数据库中添加一个列,插入记录后自动增加。删除记录时应该自动减少。该字段用于存储表标题的序列号,标题应该是能够重新排序,因此数字序列之间不应该有任何差距。我尝试过使用 TRIGGER 和 SEQUENCE 但它不起作用。有没有办法使用 PL/SQL 来实现这一点。实际上我想要的是转移删除记录时的序号。

eg:row 1,row 2,row 3,row 4,row 5 如果我们删除第 3 行,顺序应该是第 1 行,第 2 行,第 3 行,第 4 行,第 4 行的记录应该排在第 4 行3等等..

我正在使用jsp-servlet技术。如果有任何方法可以使用java来做到这一点也很好。

谢谢!

【问题讨论】:

我在想 updateorder byrownum 放在一起应该可以满足您的需求。 (你这不是为了你的PK吧?) 不,这不是PK字段。但是删除序列中间的记录后,应该重新排列序列的其余部分。这可能吗? Oracle 序列无法重新排列,但您可以实现自己的序列。但这肯定是浪费时间。 【参考方案1】:

没有;没有简单的方法。

无论您对序列做什么,它们都会never generate a gap free sequence of numbers,完美的1, 2 .. n。即使他们这样做了,也无法自动为整个表或表中的一组行重新生成序列,而无需从头开始重新生成它。简单来说如果删除第3行,就需要更新所有条序号大于3的记录。这显然很可笑。

我不明白为什么你想这样做,但是,假设你做了我的“回答”,那就是根本不把这些信息存储在你的表中。对于那些需要此列的查询,使用分析函数row_number() 即时生成它。例如:

select column1, column2, row_number() over ( order by <whatever> ) as my_sequence
  from my_table

这会按照ORDER BY 子句中给定的顺序为每一行分配一个唯一编号。

你也可以把它放在一个视图中,这样你甚至不需要记住把它放在查询中,你可以确定它每次都是以完全相同的方式生成的。

【讨论】:

以上是关于在 oracle 10g 中添加自动增量和自动减量列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何将自动增量添加到现有表中

如何在 jQuery Ui 滑块中添加自定义增量和减量计数器

向oracle中的现有表添加自动增量主键[重复]

Oracle Forms 10g 自动查询

使用增量和减量运算符进行加法和减法。 C++

Oracle的自动维护任务