2011-08-04 11 views
2

ユーザが入力したlat/lngカラムに基づいてGEOMETRYカラムを更新するトリガを作成しようとしています。テーブルを更新できません ': - 私はLNG、緯度値を使用して新しい行を挿入するときしかし、私は次のエラーを取得する他のフィールドに基づいてフィールドを計算するmysql 'insert after'トリガー

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

-

ERROR 1442(HY000)私のトリガーはそうのように見えますこのストアドファンクション/トリガを起動したステートメントによってすでに使用されているため、ストアドファンクション/トリガでは「tbl」になります。

このようなトリガーを作成できませんか?そうでない場合、これを自動化する方法は何ですか? MySQLのドキュメントによると

答えて

6

BEFORE INSERTトリガーを使用して、必要な値を変更してみてください。 -

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

EDIT

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

それらの列が最初に移入されない限り、うーん...どのように私は他の列の値でNEW.column1を更新することができますか?このアプリケーションでは、ユーザーは緯度/経度の値を入力できます。 Point()は、これらのlat/lng値を使用して計算されます。更新:実際には、この提案はうまくいきます。私がしなければならないのは、すべての値にNEWという接頭辞を付けることだけです。ありがとう。 – punkish

+0

私は例を追加しました。 – Devart

0

はここで見つける:http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

をストアドファンクションやトリガ内では、すでに 文によって(読み取りまたは書き込みのために)使用されている テーブルを変更することが許可されていません関数またはトリガーを呼び出す関数。

coordが常にPoint(lng、lat)になるようにするには、テーブルのオーバービューを上に置いて、それを列の1つにして、テーブルの代わりにビューを照会するとよいでしょう。

私は別の回避策を考えたら、投稿してください。

関連する問題