2015-01-16 3 views
0

Мой триггер выглядит следующим образом:триггер вызывает # 1054 - Неизвестный столбец «х» в «где предложение»

DROP TRIGGER IF EXISTS `trigger_name`; 
DELIMITER // 
CREATE TRIGGER `trigger_name` 
AFTER UPDATE ON `table1` 
FOR EACH ROW UPDATE `table2` SET `modified` = CURRENT_TIMESTAMP WHERE `id` = `NEW.id` 
// 
DELIMITER ; 

Этот сбой с выше ошибки (# 1054), если это сделать:

UPDATE table1 SET owner = NULL WHERE id = 82 

Обнаружено решение! Проблема заключается в обратных кавычках/обратных выводах (`). Если я переписываю спусковой крючок, как

DROP TRIGGER IF EXISTS trigger_name; 
DELIMITER // 
CREATE TRIGGER trigger_name 
AFTER UPDATE ON table1 
FOR EACH ROW UPDATE table2 SET modified = CURRENT_TIMESTAMP WHERE id = NEW.id 
// 
DELIMITER ; 

Все работает нормально! :-) Я полагаю, что урок никогда не использует обратные кавычки/обратные ссылки (`), если только это не обязательно.

ответ

0

Проблема заключается в обратных кавычках/обратных выводах (`). См редактирование исходного вопроса

1

Проблема с обратными кавычками/кавычку (`)

Проблема заключается не в рюкзаках, а в том, что вы использовали их неправильно

...WHERE `id` = `NEW.id` 
       ^ ^

Написав его, таким образом, вы хотите сказать, MySQL, что вы хотите, чтобы обновить все строки в таблице, которые имеют одинаковое значение в два колоннах id и NEW.id. Да, вы можете иметь столбец с таким именем, если хотите. Вот SQLFiddle demo.

  1. NEW ключевым слово не должно быть backticked
  2. вам нужна кавычка идентификаторов объектов только (id в вашем случае), когда вы используете точечную нотацию (<table>.<column>).

Написано правильно он должен уже выглядел как этот вместо

...WHERE `id` = NEW.`id` 
        ^^ 

Это, как говорится, если вы не используете недопустимые символы или зарезервированные слова в идентификаторах объектов базы данных нет необходимости использовать backtiks.