我们有几个表需要添加自动递增触发器(以及其他一些故障保险箱)
对我们来说,最简单的方法是对所有表使用通用过程,使用Select MAX()来获取下一个递增值。
或者开发一个有点复杂的循环来为每个表创建一个序列和自定义触发器。
我们希望采用最简单的方法,但我不确定它是否比使用序列需要更多的处理,这种差异有多大,以及如何计算它
基本上,Select MAX(my_field)
与my_sequence.nextval()
相比有多慢?
答案 0 :(得分:3)
你可能应该使用一个序列,因为它们比从表中选择要快得多。
从表中选择max()的问题是,如果一次执行多个会话,则可以获得相同的最大值,然后向其中添加一个,并且两者都使用相同的唯一值。我无法想到你想要选择max()来获得下一个值的原因。
序列很快,保证不会在多个会话中使用相同的值。
巴比
答案 1 :(得分:2)
评论太长了。
如果要在Oracle 12C之前在Oracle中创建顺序标识,则使用序列和触发器。 Here是代码示例。这并不难。它比MAX()
计算更有效。它没有竞争条件。
在Oracle 12C中,使用GENERATED ALWAYS AS IDENTITY
列。根本不需要触发器。