2011-11-17 44 views
0

這是一系列問題中的第三個問題。現在我已經有了一個MySQL觸發器,它可以將一個表中的一行更新爲一個單獨表格中行的新值。修復我的多表觸發器?

下面是一些視覺效果:

CREATE TABLE As (
    id 
    a 
) ENGINE MyISAM 

CREATE TABLE Bs (
    id 
    b 
) ENGINE MyISAM 

CREATE TABLE AbyB (
    id 
    aid 
    bid 
) 

ROWS 
    | A | B | AbyB | 
    id| 1 | 2 |  0 | 
    a | i | x |  x | 
    b | x | i |  x | --> | x | 0 | x | 
aid | x | x |  1 | 
bid | x | x |  2 | 

INSERT INTO table1 VALUES(1); 

DELIMITER $$ 

CREATE TRIGGER dualupdate() BEFORE INSERT INTO Bs.b 
BEGIN 
    SET @a = 'SELECT NEW.b'; #I don't know if I should use NEW, actually. 
    SET @b = 'SELECT NEW.id'; 
    SET @x = 'SELECT aid FROM AbyB WHERE bid = @b'; 
    UPDATE As 
    SET a = @a #SET is used to set variables, right? So, am I using it wrong? 
    WHERE id = @x; 
END$$ 

DELIMITER ; 

回答

1

你進行了一些錯誤,下面是正確的代碼:

DELIMITER $$ 

CREATE TRIGGER ai_Bs_each AFTER INSERT ON Bs FOR EACH ROW 
BEGIN 
    UPDATE `As` 
    SET a = New.b 
    WHERE id IN (SELECT aid FROM AbyB WHERE bid = NEW.id); 
END$$ 

DELIMITER ; 

下面是錯誤的一個破敗您所做:

CREATE TRIGGER dualupdate() BEFORE INSERT INTO Bs.b    
//This is incorrect syntax. 
//This should really be an AFTER INSERT trigger. If the insert fails `As` will 
//be incorrectly updated. Not unless you want to prevent the insert if the 
//update does not succeed. 

BEGIN    
    SET @a = 'SELECT NEW.b'; #I don't know if I should use NEW, actually. 
    //You're filling @a with a string containing the words `select` and `new`. 
    //SET @a = NEW.b; will work better. 
    SET @b = 'SELECT NEW.id'; 
    SET @x = 'SELECT aid FROM AbyB WHERE bid = @b'; 
    //This is a fundamental error, you can only ever put 1 result in a variable, 
    //not a resultset. 
    //If you want to use multiple values, put the select inside the update statement. 
    //See my updated code. 
    UPDATE As   
    SET a = @a #SET is used to set variables, right? So, am I using it wrong? 
    WHERE id = @x;  
    //This statement is (almost) correct, However `as` is a reserved word and needs 
    //to be escaped in backticks ` 
END$$    

這裏不需要變量。您可以直接使用NEW.?
另請注意,MySQL不支持每條語句的觸發器,僅限每行。但是,將來這可能會發生變化,因此您必須包含for each row

請參見:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
人和:http://dev.mysql.com/doc/refman/5.0/en/update.html

MySQL的文檔是真的很不錯,只是谷歌mysql statement_to_find和第一或第二的結果應該指向MySQL的文檔。

+0

因此,基本上做的是在a更新時更新b,在新的B.id與AbyB中的A.id重疊的位置,對吧? :D –

+0

@ Wolfpack'08正好 – Johan

+0

甜。謝謝,約翰。今晚我將能夠測試它。我很激動。 :) –