質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

799閲覧

MySQL triggerの中の比較演算子の中に既存数値の代入ができない

tajix_japan

総合スコア132

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2021/01/01 04:49

編集2021/01/01 05:18

fx価格のチャートのデータベースを作っています。
テーブルは「fxprice_eurusd テーブル」と「fxprice_eurusd_1h_chartテーブル」の2つ、
これをトリガーで繋いでいます。

【テーブルの説明およびトリガーでやろうとしていること】
「fxprice_eurusd テーブル」については
eurusd_price,
unixtime1h,
timestamp
の3つのカラムからなっており、eurusd_priceは1分ごとの価格、unixtime1hは1時間ごとに新しい数字を採番します。

これをトリガーで「fxprice_eurusd_1h_chartテーブル」に書き写します。
fxprice_eurusd_1h_chartテーブル」には、上記に加え、始値、高値、安値が新たに加わります。

fxprice_eurusd_1h_chartテーブル」
eurusd_stp,
eurusd_hip,
eurusd_lop,
eurusd_price,
unixtime1h,(primary key) timestamp`

始値、高値、安値、現在値とも00分の時に新規数値が入ります。

1分ごとに更新した際、過去の高値を超えたらeurusd_hipを更新、過去の安値を超えたらeurusd_lopを更新したいというのが趣旨です。

【困りごと】
下記のトリガーを組みましたが動きません。

mysql

1 2DELIMITER // 3CREATE TRIGGER `fxprice_eurusd_1h_chart` 4AFTER INSERT ON `fxprice_eurusd` 5FOR EACH ROW BEGIN 6INSERT INTO `fxprice_eurusd_1min_chart` SET 7`eurusd_stp`=NEW.`eurusd_price`, 8`eurusd_hip`=NEW.`eurusd_price`, 9`eurusd_lop`=NEW.`eurusd_price`, 10`eurusd_price`=NEW.`eurusd_price`, 11`unixtime1h`=NEW.`unixtime1h`, 12`timestamp`=NEW.`timestamp` 13ON DUPLICATE KEY UPDATE 14`eurusd_hip`=(SELECT GREATEST(OLD.`eurusd_hip`,NEW.`eurusd_price`)), 15`eurusd_lop`=(SELECT LEAST(OLD.`eurusd_lop`,NEW.`eurusd_price`)), 16`eurusd_price`=NEW.`eurusd_price`; 17END; 18// 19DELIMITER;

下記のようにeurusd_hipeurusd_lopを実数にすると動きますので、sqlは間違っていません。
代入ができないようです。

eurusd_hip=(SELECT GREATEST('3',NEW.eurusd_price)),
eurusd_lop=(SELECT LEAST('4',NEW.eurusd_price)),

上記の'3' や '4' の場所に、現在のeurusd_hipeurusd_lopを代入できれば機能する思うのですが、どのように書けばいいかがわかりません。

ご教示いただきたくお願いいたします。

追伸

old.の文字を付け加えましたが、
#1363 - There is no OLD row in on INSERT trigger
となってしまいました。

old.はupdateで使えるはずなのですが、insertトリガー内のdupricate key updateでは使えないようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

MySQLの仕組み上難しそうなので、間にもう一つテーブルをかませ、それのアップデートをトリガとして動かす仕様に変更し解決しました。

投稿2021/01/02 00:19

tajix_japan

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問