まず、システムについて説明します。2 つのシステムに 2 つの同等のデータベースがあり、15 分ごとに複数のテーブルの新しいデータが同期されます。
このために、最初のデータベースの最後の主キーと 2 番目のデータベースの最後の主キーを比較します。すべての新しいデータは、INSERT ステートメントを介して 2 番目のデータベースに挿入されます。データ ボリュームは、少なくとも 200 から 500 のデータセットになります。データベースを備えたサーバーは、インターネット経由で接続されています。
問題: 2 番目のデータベースでは、異なるテーブルの 2 つの値から値を計算し、これを 3 番目のデータベースに書き込む必要があります。だから私はストアド プロシージャを書き、テーブルの 1 つのトリガーによってこれを呼び出します。
ただし、トリガーを含むテーブルには、最初のサーバーの同等のデータよりも少ないデータが格納されます。したがって、ストアド プロシージャの実行時にデータが失われると思います。しかし、なぜ?テストシステムでは機能しますが、生産プロセスでは機能しません。
もう 1 つの興味深い点は、データベースの実際の主キー (自動インクリメント整数) が同じであることです。しかし、2 番目のデータベースには含まれるデータが少なくなります。
CREATE DEFINER=`root`@`%` PROCEDURE `calcSigma`(IN `val1` DOUBLE(10,2), IN `ident` VARCHAR(20), IN `id` INT(11), IN `ts` DATETIME)
BEGIN
DECLARE phi, theta, sigma double DEFAULT 0;
IF ident='x_theta' THEN
SET theta = val1;
SET phi = (SELECT
val
FROM
x_phi
WHERE
sensors_id = id
AND
HOUR(
TIMEDIFF(
ts, ts_rised))='0'
AND
MINUTE(
TIMEDIFF(
ts, ts_rised))='0'
ORDER BY
ts_rised
DESC LIMIT 1); END IF;
IF theta<>0 && phi<>0 THEN
IF theta >= 0 THEN
SET sigma =(((phi/100)*(288.68*POW(1.098+(theta/100),8.02)))/(461.5*(theta+273.15)));
ELSEIF theta < 0 THEN
SET sigma =(((phi/100)*(4.689*POW(1.486+(theta/100),12.3)))/(461.5*(theta+273.15)));
END IF;
INSERT INTO
x_sigma (ts_rised, val, sensors_id)
VALUES (ts, sigma, id);
END IF;
END