2017-02-23 81 views
1

我在兩個表(table_a,table_b)中有三列數據(A,B,C),我希望使用觸發器來更新列連接列值爲table_a的列從table_atable_b任何時候在table_a中更新記錄。如何使用觸發器進行交叉表更新

CREATE TABLE 'table_a' 
(
    'id' BIGINT(50) NOT NULL, 
    'A' VARCHAR(5) NULL, 
    'B' VARCHAR(5) NULL, 
    'C' VARCHAR(5) NULL, 
    PRIMARYKEY ('id') 
) 

CREATE TABLE 'table_b' 
(
    'id' BIGINT(50) NOT NULL, 
    'A' VARCHAR(5) NULL, 
    'B' VARCHAR(5) NULL, 
    'C' VARCHAR(5) NULL, 
    PRIMARYKEY ('id') 
) 

INSERT INTO table_a (A, B, C) VALUES (1, 2, 3) 
INSERT INTO table_b (A, B, C) VALUES (4, 5, 6) 

沒有觸發器,我會用這個語句來更新表-A

UPDATE Table_a 
SET table_a.A = COALESCE(table_a.B, 0) + ’,’ + COALESCE(table_b.A, 0) 
FROM table_a 
INNER JOIN table_b ON table_a.id = table_b.id 
WHERE table_a.id = 1 

更新後

表-A

| A | B | C | 
|------+----+----+ 
| 2, 4 | 2 | 3 | 

這是我在觸發嘗試

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER update_table_a 
ON table_a 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @id as BIGINT 

    SELECT @id = id FROM updated 

    UPDATE table_a 
    SET table_a.A = COALESCE(table_a.B, 0) + ‘,’ + COALESCE(table_b.A, 0) 
    FROM Table_a 
    INNER JOIN table_b ON table_a.id = table_b.id 
    WHERE table_a.id = @id 
END 
GO 

我的問題是,當我嘗試更改該列中的值並使用此觸發器時,table_a.A中的值恢復爲其原始值。

+0

第一件事情,千萬不要用下面的語句,因爲插入表(有沒有更新的表)可以有多個記錄: 選擇@id = ID從更新 – HLGEM

+2

你觸發了** **主要缺陷因爲你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,因此如果觸發此觸發器的'UPDATE'語句插入25行,則觸發器將觸發**一次**,但隨後會出現'Inserted'和'Deleted僞表每個將包含25行。您的代碼在這25行中選擇哪一個? 'SELECT @Id ='只選擇一個非確定性行,而你將**忽略所有其他行**。你需要重寫你的觸發器來考慮這個問題! –

回答

1

沒有僞代碼表叫updated - 在UPDATE觸發的情況下,你有Deleted與舊值(更新前發生),和Inserted與更新後的新值。

您需要使用此正確設置基於代碼來處理此更新 - 你需要使用包含已更新(在table_A)行的所有新值Inserted假表。

CREATE TRIGGER update_table_a 
ON table_a 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE table_a 
    SET A = COALESCE(i.B, 0) + ‘,’ + COALESCE(table_b.A, 0) 
    FROM Table_a 
    INNER JOIN table_b ON table_a.id = table_b.id 
    INNER JOIN Inserted i ON table_a.id = i.id 
END 
GO 
+1

當你進行更改時,你的代碼沒有更新table_a中的值的原因是由於沒有更新的表,所以你的@ID值爲空,因此沒有實際的記錄被觸發器更新。 – HLGEM

+0

感謝大家的幫助。這工作。我是過分限制,更不用說使用錯誤的僞表引用。附加問題。如果正在更新的表具有數十萬條記錄,該記錄已經與否則會填充table_a.A中的值的值相匹配。觸發器開頭的「If」語句是否可以包含在內? – JRP

+0

@JRP:如果此答案可幫助您解決問題,請[**接受此答案**](http://meta.stackoverflow.com/q/5234/153998)。這將表明你對那些花時間幫助你的人表示感謝。 –