在 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来做到这一点也很好。
谢谢!
【问题讨论】:
我在想update
、order by
和 rownum
放在一起应该可以满足您的需求。 (你这不是为了你的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 中添加自动增量和自动减量列的主要内容,如果未能解决你的问题,请参考以下文章