在Oracle中使用触发器模拟IDENTITY/AUTOINCREMENT列有多糟糕?

3

我维护的应用程序最初是针对SQL Server特定编写的(使用IDENTITY字段)。因此,我们不得不定义许多触发器来自动递增表的主键。

有人告诉我,在Oracle世界中,这被认为是一种hacky解决方法,但那是以“朋友的朋友”的方式告诉我的。使用触发器从序列中递增主键而不直接使用序列有多大问题?


你能升级你的Oracle吗?我记得10g(还是11g?)已经可以在其DEFAULT中包含序列,从而消除了触发器的需要。 - Vilx-
5
据我所知,即使在11G中,您也无法将序列用作列默认值。 - Tony Andrews
是的,在11G中没有序列作为列默认值。11G中的变化是,现在可以在PL/SQL中使用序列作为变量声明的默认值,而不必执行针对dual的select以使用序列nextval填充变量。 - Doug Porter
2个回答

10

根据我的经验,这是一种非常常见的做法,而且并不太糟糕。然而,如果您可以控制插入(例如,如果所有插入都通过 PL/SQL API 完成),那么在 INSERT 语句中直接使用序列会更加高效 - 因为它避免了触发器的开销。但是,如果您已经使用了触发器,我真的不必过于担心!


这正是我所想的。我认为这只是被视为“良好实践”,就像关闭文件而不是让它们在进程结束时不被关闭一样。 - Jason Baker

1

这可能与主题不完全相关,但在合并语句中使用“before insert trigger”自动递增主键是一个很好的选择。如果直接在合并插入部分中使用序列,则似乎即使进行更新操作也会调用该序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接