【问题标题】:How bad is it to simulate IDENTITY/AUTOINCREMENT columns using triggers in Oracle?在 Oracle 中使用触发器模拟 IDENTITY/AUTOINCREMENT 列有多糟糕?
【发布时间】:2010-12-23 13:40:48
【问题描述】:

我维护了一个最初编写为特定于 SQL Server 的应用程序(使用 IDENTITY 字段)。因此,我们不得不定义很多触发器来自动增加表的主键。

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

【问题讨论】:

  • 你能升级你的Oracle吗?我认为 10g(或者是 11g?)可能已经在它的 DEFAULT 中有一个序列,因此不需要触发器。
  • 据我所知,即使在 11G 中,您也不能将序列用作列默认值。
  • 是的,在 11G 中没有序列作为默认列。 11G 的变化在于,在 PL/SQL 中,您现在可以在变量声明中使用序列作为默认值,而不必对 dual 进行选择以使用序列 nextval 填充变量。

标签: oracle triggers primary-key identity sequences


【解决方案1】:

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

【讨论】:

  • 这就是我的想法。我认为这只是被认为是“良好做法”,与关闭文件的方式大致相同,而不是在进程结束时不让它们关闭。
【解决方案2】:

这可能并不完全相关,但使用“插入前触发器”来自动增加主键是一个不错的选择,尤其是在 Merge 语句中。如果一个序列直接在 Merge 插入部分中使用,则该序列似乎即使在更新时也会被调用。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2020-03-03
    • 2018-03-10
    • 2011-04-17
    • 2022-12-20
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多