Исправить мой многостольный триггер? - PullRequest
0 голосов
/ 17 ноября 2011

Это третий в серии вопросов. Теперь у меня есть триггер 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 Ответ

1 голос
/ 17 ноября 2011

Вы делаете несколько ошибок, ниже приведен правильный код:

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 действительно хороши, просто google mysql statement_to_find, и первый или второй результат должен указывать на документы MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...