триггер mysql 'after insert' для вычисления поля на основе других полей - PullRequest
3 голосов
/ 04 августа 2011

Я пытаюсь создать триггер, который будет обновлять столбец GEOMETRY на основе столбцов lat / lng, введенных пользователем. Мой триггер выглядит так -

CREATE TRIGGER `tbl.foo`   
    AFTER INSERT ON `tbl` FOR EACH ROW  
    BEGIN  
        UPDATE tbl
        SET coord = Point(lng, lat)
        WHERE id = NEW.id; 
    END

Однако я получаю следующую ошибку, когда вставляю новую строку со значениями lng, lat -

ОШИБКА 1442 (HY000): невозможно обновить таблицу 'tbl' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер.

Можно ли создать такой триггер? Если нет, то как это автоматизировать?

Ответы [ 2 ]

6 голосов
/ 04 августа 2011

Попробуйте использовать ПЕРЕД ВВОДОМ триггера и измените нужное значение, например -

CREATE TRIGGER trigger1
  BEFORE INSERT
  ON table1
  FOR EACH ROW
BEGIN
  SET NEW.column1 = 'another value';
END

РЕДАКТИРОВАТЬ

CREATE TABLE table_test_trigger (
  id INT(11) NOT NULL AUTO_INCREMENT,
  a INT(11) DEFAULT NULL,
  b INT(11) DEFAULT NULL,
  c INT(11) DEFAULT NULL,
  PRIMARY KEY (id)
);

DELIMITER $$

CREATE TRIGGER trigger1
    BEFORE INSERT
    ON table_test_trigger
    FOR EACH ROW
BEGIN
  SET NEW.c = NEW.a + NEW.b;
END
$$

DELIMITER ;

INSERT INTO table_test_trigger(a, b) VALUES (10, 5);

SELECT * FROM table_test_trigger;

+----+------+------+------+
| id | a    | b    | c    |
+----+------+------+------+
|  1 |   10 |    5 |   15 |
+----+------+------+------+
0 голосов
/ 04 августа 2011

Согласно документации MySQL, найденной здесь: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

Внутри сохраненной функции или триггера запрещено изменять таблица, которая уже используется (для чтения или записи) оператор, который вызвал функцию или триггер.

Если вы хотите, чтобы координаты всегда были Point (lng, lat), вы можете просто поместить представление поверх таблицы и указать один из столбцов, а затем запросить представление вместо таблицы.

Если я подумаю о другом обходном пути, я обязательно опубликую его.

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