Вы делаете несколько ошибок, ниже приведен правильный код:
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.