TRIGGER на основе пространственных данных - PullRequest
0 голосов
/ 28 марта 2011

У меня есть таблица с именем pano_raw, которая имеет 3 столбца lat, lng и latlng.

lat и lng - просто десятичные числа (10,3), а latlng - пространственный индекс типа POINT.

Это пример оператора, который обновляет базу данных на основе широты и ширины.

INSERT INTO pano_raw (latlng) VALUES( GeomFromText( 'POINT(-72.34 32.45)' ));

Я пытаюсь создать триггер на основе приведенного выше оператора, который автоматически обновит столбец, когда яОбновите lat и lng отдельно.Трудно каждый раз обновлять столбец пространственных данных с помощью SQL, поскольку запрос является специализированным.Намного проще написать триггер (теоретически), который будет обновляться, когда я записываю в таблицу простое десятичное значение.

Проблема, с которой я столкнулся, связана с синтаксисом.Вот мой лучший (2 часа на это).

SET @sql := CONCAT('POINT(',pano_raw.lng,' ',pano_raw.lat,')');

CREATE TRIGGER trig_pano_raw BEFORE INSERT ON pano_raw
FOR EACH ROW
BEGIN
    SET pano_raw.latlng = GeomFromText( @sql ) );
END;
CREATE TRIGGER trig_pano_raw BEFORE UPDATE ON pano_raw
FOR EACH ROW
BEGIN
    SET pano_raw.latlng = GeomFromText( @sql ) );
END;

Я был бы очень признателен за помощь в получении этой работы.

1 Ответ

0 голосов
/ 28 марта 2011

Это не работает?

CREATE TRIGGER trig_pano_raw BEFORE INSERT ON pano_raw
FOR EACH ROW
BEGIN
    SET NEW.latlng = PointFromWKB( POINT( NEW.lat, NEW.lng ) );
END;

Что касается триггера обновления, обратите внимание, что

  • 1-й, он должен иметь другое имя и

  • 2-й, вы можете проверить, какое поле обновляется, например:

триггер обновления

DELIMITER $$
CREATE TRIGGER trig_Update_pano_raw BEFORE UPDATE ON pano_raw
FOR EACH ROW
BEGIN
    IF ((NEW.lat != OLD.lat) OR (NEW.lng != OLD.lng))
    THEN
        SET NEW.latlng = PointFromWKB( POINT( NEW.lat, NEW.lng ) );
    ELSEIF (NEW.latlng != OLD.latlng)
    THEN
        BEGIN
            SET NEW.lat = X(NEW.latlng);
            SET NEW.lng = Y(NEW.latlng);
        END;
    END IF;
END;$$
DELIMITER ;
...