我維護最初編寫爲SQL Server特定的應用程序(使用IDENTITY字段)。因此,我們必須定義大量觸發器來自動增加表的主鍵。在Oracle中使用觸發器模擬IDENTITY/AUTOINCREMENT列有多糟?
我被告知這被認爲是甲骨文世界中的一個拙劣的解決方法,但這被告知給我一個「朋友的朋友」的方式。使用觸發器從序列中增加主鍵而不是直接使用序列有多大?
我維護最初編寫爲SQL Server特定的應用程序(使用IDENTITY字段)。因此,我們必須定義大量觸發器來自動增加表的主鍵。在Oracle中使用觸發器模擬IDENTITY/AUTOINCREMENT列有多糟?
我被告知這被認爲是甲骨文世界中的一個拙劣的解決方法,但這被告知給我一個「朋友的朋友」的方式。使用觸發器從序列中增加主鍵而不是直接使用序列有多大?
根據我的經驗,這是非常普遍的做法,而不是非常糟糕的做法。但是,如果您可以控制插入(例如,如果所有插入都是通過PL/SQL API完成的),那麼在INSERT語句中直接使用序列效率更高 - 因爲它避免了觸發觸發的開銷。但如果你使用觸發器,我真的不會過分擔心!
這就是我在想什麼。我認爲它與關閉文件的方式大致相同,而不是讓它們在過程結束時關閉,這只是「良好做法」。 – 2009-12-05 15:16:18
+1,你的選擇是相當有限的。 – DCookie 2009-12-05 17:12:34
這可能不完全相關,但使用「插入觸發器之前」來自動遞增主鍵是一個很好的選擇,特別是在Merge語句中。如果直接在合併插入部分中使用序列,則即使對於更新,該序列似乎也會被調用。
你可以升級你的Oracle嗎?我認爲10g(或者是11g?)在DEFAULT中可能已經有一個序列,因此不需要觸發器。 – 2009-12-05 14:58:45
就我所知,即使在11G中,也不能將序列用作列默認值。 – 2009-12-05 15:07:02
是的,沒有序列作爲11G的列默認。 11G中的變化是,在PL/SQL中,現在您可以將一個序列用作變量聲明的默認值,而不必對double進行選擇以填充具有nextval序列的變量。 – 2009-12-05 21:52:54