SQLite:触发器以对照另一个表中的限制检查新插入的行

问题描述 投票:0回答:1

我有一个具有以下架构的数据库:

Sensors (
ID      INTEGER PRIMARY KEY AUTOINCREMENT
                UNIQUE
                NOT NULL,
SITE_ID INTEGER REFERENCES Sites (ID) 
                NOT NULL,
NAME    TEXT    UNIQUE
                NOT NULL
);

Sites (
ID   INTEGER PRIMARY KEY AUTOINCREMENT
             UNIQUE
             NOT NULL,
NAME TEXT    UNIQUE
             NOT NULL
);

Data (
SENSOR_ID INTEGER  REFERENCES Sensors (ID) 
                   NOT NULL,
COUNT     INTEGER  NOT NULL,
TIME      DATETIME NOT NULL,
TYPE      TEXT     NOT NULL,
VALUE     REAL     NOT NULL,
PRIMARY KEY (
    SENSOR_ID,
    COUNT,
    TIME,
    TYPE
)
);

Limits (
SITE_ID INTEGER REFERENCES Sites (ID) 
                NOT NULL,
TYPE    TEXT    NOT NULL,
HIGH    REAL    NOT NULL,
LOW     REAL    NOT NULL,
PRIMARY KEY (
    SITE_ID,
    TYPE
)
);

数据包含所有传感器和站点的所有数据,数据具有几种不同的类型。每个站点的每种数据的限制都有一行。我想创建一个与数据相同的表(称为“警告”),仅包含其值超出Limit限制范围内的行。

我想使用触发器来执行此操作,因为限制可能会更改,并且行会偶尔添加到数据中。

到目前为止,这是我最好的尝试:

CREATE TRIGGER VALUE_OUT_OF_RANGE 
AFTER INSERT
ON Data
WHEN NEW.VALUE < (SELECT Limits.LOW FROM Limits INNER JOIN Sensors ON (Sensors.SITE_ID = Limits.SITE_ID) WHERE (Sensors.ID = NEW.SENSOR_ID AND Limits.TYPE = NEW.TYPE))
BEGIN
    INSERT INTO Warnings(SENSOR_ID, COUNT, TIME, TYPE, VALUE) VALUES(NEW.SENSOR_ID, NEW.COUNT, NEW.TIME, NEW.TYPE, NEW.VALUE);
END;

在尝试时,我仅检查了下限,在最后一个触发器中,我想检查该值是否在LOW和HIGH限制之间。我已经分别尝试了Select语句,并且得到了所需的数据。任何帮助或建议,我们将不胜感激。

sqlite inner-join database-trigger
1个回答
0
投票
CREATE TRIGGER VALUE_OUT_OF_RANGE AFTER INSERT ON Data FOR EACH ROW WHEN NEW.VALUE < ( SELECT Limits.LOW FROM Limits JOIN Sensors ON (Sensors.SITE_ID = Limits.SITE_ID) WHERE (Sensors.ID = NEW.Sensor_ID AND Limits.TYPE = NEW.TYPE) LIMIT 1 ) OR NEW.VALUE > ( SELECT Limits.HIGH FROM Limits JOIN Sensors ON (Sensors.SITE_ID = Limits.SITE_ID) WHERE (Sensors.ID = NEW.Sensor_ID AND Limits.TYPE = NEW.TYPE) LIMIT 1 ) BEGIN INSERT INTO Warnings ( SENSOR_ID, COUNT, TIME, TYPE, VALUE ) VALUES ( NEW.SENSOR_ID, NEW.COUNT, NEW.TIME, NEW.TYPE, NEW.VALUE ); END;
© www.soinside.com 2019 - 2024. All rights reserved.