表:具有列Start_Time和End_Time的客戶。幫助使用同一個表的其他列更新列
我需要添加一個新的列「持續時間」,即End_Time - Start_Time。 但是,我需要使用觸發器或過程來做到這一點,以便在向Customer表添加新記錄後立即更新列Duration。
表:具有列Start_Time和End_Time的客戶。幫助使用同一個表的其他列更新列
我需要添加一個新的列「持續時間」,即End_Time - Start_Time。 但是,我需要使用觸發器或過程來做到這一點,以便在向Customer表添加新記錄後立即更新列Duration。
如果您使用MS SQL,理想的答案可能是計算列。
實際複製的數據越少,數據不一致的機會越少,因此您的模式會導致一致性確保/驗證代碼越少,維護流程越少。爲了進行設置(再次使用MS SQL),只需使用設計器添加另一列,然後展開「計算列說明」區域即可。 (您可以參考此表中的其他列進行此計算。)然後輸入「End_Time - Start_Time」。取決於您要對此數據執行的操作,可能需要爲公式使用DATEDIFF(分鐘,開始時間,結束時間)等內容。這正是這個功能的用途。
如果這是一個非常昂貴的計算(根據您提供的信息,您的計算可能不是這樣),您可以將結果配置爲「持續」 - 這非常類似觸發器,但更易於實施和維護。
或者,您可以創建一個新的視圖來執行相同的計算,並在獲取信息時通過它「投影」第一個表。但你可能已經知道了,這個答案就此誕生了! :)
p.s.我個人建議避免像鼠疫這樣的觸發器。它們會導致開發人員,維護人員或管理員通常不期望的額外操作。這可能會導致操作失敗,返回意外的額外結果集或修改管理員可能特別試圖避免在管理期間修改的行(請參閱:不支持的grin)修復。
p.p.s.在這種情況下,我也建議針對存儲過程,出於與觸發器相同的維護原因。雖然可以限制安全性,以便更新表的唯一方法是通過存儲過程,但由於觸發器可能會失敗的許多相同原因,這可能會失敗。如果可以,最好避免重複數據。
p.p.p.s :)這並不是說存儲過程整體上不好。對於複雜的事務操作或對大型相關表進行緊密集成的過程過濾以返回相對較小的結果集,它們通常仍是最佳選擇。
非常感謝:D – indolent 2011-03-16 04:58:31
按照shannon的說法,雖然oracle中的術語是「Virtual Column」 有11g的增強。在此之前,使用一個視圖(並且這仍然是11g的潛在答案)。
請勿使用觸發器或存儲過程。
您是否在問如何設置觸發器,或者如何添加列,或者如何編寫查詢來設置新列的值? – 2011-03-16 03:40:11
爲什麼你希望在表格中添加一個計算列?任何查詢都可以得到它。或者,你可以創建一個視圖來獲得持續時間。 – Kangkan 2011-03-16 04:02:36