我有一个具有以下架构的数据库:
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语句,并且得到了所需的数据。任何帮助或建议,我们将不胜感激。
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;