2

よく似た質問をたくさん見ましたが、答えをクロールしてもトリガーエラーをなくすことはできませんでした。
必要な結果は次のとおりです。データベーステーブルに新しい値が挿入されるたびtemp_poolにトリガーされ、新しいアドレスが以前のアドレス値と同じでない場合は、新しい値がロケーションテーブルに挿入されますdev_idNEW.dev_id

クエリ(サンプル)は次のとおりです。

CREATE TRIGGER filter 
after insert on geo.temp_pool
for each row
BEGIN
DECLARE OLD_ADDR VARCHAR(2048);
OLD_AADR = select address from temp_pool where dev_id like NEW.dev_id
order by date desc, time desc limit 1;
IF (OLD_ADDR != NEW.address) THEN
INSERT INTO a3380361_geo.location
VALUES (NEW.dev_id,NEW.address,NEW.lat,NEW.lng,NEW.date,NEW.time);
END IF;
END
$$

phpMyAdminエディターを使用していて、区切り文字をに設定してい$$ます。

私が得ているエラーは次のとおりです。

1064-SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、使用する正しい構文を確認してください。'=temp_poolからアドレスを選択します。'5行目

SELECTからの値を変数[ ]に割り当てることには問題があると強く信じていますがOLD_ADDR、私の問題を解決する方法はありますか?
ロジックは単純で、要件はクエリから理解できますよね?

すべての意見や提案を受け入れます。

4

2 に答える 2

4

それ以外の:

 OLD_AADR = select address from temp_pool where dev_id like NEW.dev_id

使用する:

SET OLD_AADR = (select address 
                from temp_pool 
                where dev_id like NEW.dev_id 
                order by address 
                limit 1);

または、非標準のSELECT代入ステートメントを使用します(mysqlがそれをサポートしているかどうかはわかりません):

SELECT OLD_AADR = address from temp_pool where dev_id like NEW.dev_id
                  order by address 
                  limit 1;

どちらの場合も、SELECTステートメントはスカラー値のみを返す必要があるわけではありません。だから私はを使用しLIMIT 1ました。

于 2012-10-09T09:58:58.820 に答える
3

タイプミスに気づきましたか?

OLD_ADDR OLD_AADR

于 2014-09-16T11:30:43.810 に答える