2012-06-12 100 views
0

我對此很陌生,但想寫一些第一個簡單的觸發器。 如果我有領域A,B,C的mytable。 當用戶插入或更新A和B時,我想通過觸發器 更新C = A + B,這是否容易?謝謝在同一個表中更新/插入觸發器

+3

您正在使用哪個數據庫? –

+2

不要爲此使用觸發器。您可以隨時在選擇時檢索該金額。爲了方便,你可能想考慮一個視圖。通常:從不將值存儲在可從現有值派生的數據庫中。 –

回答

2

這是一個觸發器,會按照你的要求。由於mytable中缺少ID列,因此無法爲已更新的行指定只更新c(即,將爲每個插入/更新的每一行重新計算c的值)。

CREATE TRIGGER mytrigger 
ON mytable 
FOR INSERT, UPDATE 
AS 
    UPDATE mytable 
    SET c = COALESCE(a, 0) + COALESCE(b, 0) 

這將是一個計算列的合適候選:

CREATE TABLE mytable 
    (
    a INT, 
    b INT, 
    c AS COALESCE(a, 0) + COALESCE(b, 0) 
) 

編輯:與ID列實施例僅用於更新/插入的行更新c

CREATE TRIGGER mytrigger 
ON mytable 
FOR INSERT, UPDATE 
AS 
    UPDATE mytable 
    SET c = COALESCE(a, 0) + COALESCE(b, 0) 
    WHERE ID IN (SELECT ID 
        FROM inserted) 

我創建了一個SQL Fiddle,你可以在這裏看到它。

要通過SQL小提琴例如運行您:

  1. 創建模式,添加一些樣本數據,然後添加觸發器定義 (所以c是無人居住的在這一點)。
  2. 從表中選擇,以便您可以看到示例值。
  3. 更新一行,然後再次從表中選擇(您可以看到c 現在已被填充)。
  4. 插入一個新行,然後再次從表中選擇所有內容(已爲此新行填充c )。

要解釋一點關於如何工作 - 觸發器執行,SQL服務器中(我現在假設是您所使用的),與受影響的行的副本創建了兩個臨時表inserteddeleted如果我們需要從中獲取數據,我們可以加入或選擇這些表格;在這種情況下,只需獲取受更新/插入操作影響的ID列表,然後僅更新這些行的c。有關詳細信息,請參閱this MSDN article

+0

每次更新任何內容時,該觸發器都會更新每行。這肯定是一個性能問題。無論如何,計算列是正確的選擇(您可能希望它至少在SQL Server中保留)。 – HLGEM

+0

@HLGEM是的我知道了,我在我的回答中已經提到 - 我假設這是一個學習練習,OP只是想知道如何完成。我知道一個正確的ID列可以加入到觸發器中的「插入」表中,只更新相關的行,但在示例模式中沒有提到這樣的列。關於'persisted'的好處,但是OP仍然沒有回答他們使用的RDBMS的問題! ;-) – Bridge

+0

謝謝。這是一個更復雜的計算。我想首先學習這個概念(MS SQL 2008)。這是一個ERP軟件的數據庫,所以我們無法控制結構。我只是想計算這個C字段,並不確定這個觸發器是如何工作的。是的,我應該提到ID號。如果是更新操作,我在哪裏可以找到匹配的a&b?在mytable中?如果插入,是否需要'插入'? SET INSERT AS UPDATE mytable SET c = COALESCE(從插入的i中選擇一個,其中i.id = id,0)+ COALESCE(從插入的i中選擇b,其中i.id = id,0 ) – HoangMN

相關問題