【发布时间】:2015-07-29 10:56:59
【问题描述】:
我在介绍数据库类时遇到了一些麻烦,无法理解我在 SQL 中关于触发器可以做什么和不可以做什么。尤其是一个问题令人困惑。
我得到了这个架构(可以查看here):
CREATE TABLE Sensor(
sid int NOT NULL AUTO_INCREMENT,
Name varchar(100),
PRIMARY KEY(sid)
);
CREATE TABLE TemperatureSensor(
sid int NOT NULL,
metricSystem ENUM(‘Celsius’,’Kelvin’),
PRIMARY KEY(sid),
FOREIGN KEY(sid) REFERENCES Sensor(sid)
);
CREATE TABLE Observation(
oid int NOT NULL,
sid int NOT NULL,
PRIMARY KEY(sid,oid),
FOREIGN KEY(sid) REFERENCES Sensor(sid)
);
CREATE TABLE RawTemperature(
oid int NOT NULL,
sid int NOT NULL,
temperature float,
timestamp timestamp NOT NULL,
PRIMARY KEY(sid,oid),
FOREIGN KEY(sid,oid) REFERENCES Observation(sid,oid),
FOREIGN KEY(sid) REFERENCES TemperatureSensor(sid)
);
CREATE TABLE Event(
eid int NOT NULL AUTO_INCREMENT,
activity ENUM(‘running’,’walking’,’entering’,’Too High Temperature’),
confidence int unsigned,
PRIMARY KEY(eid)
);
CREATE TABLE DerivedFrom(
eid int NOT NULL,
sid int NOT NULL,
oid int NOT NULL,
PRIMARY KEY(eid,oid,sid),
FOREIGN KEY(eid) REFERENCES Event(eid),
FOREIGN KEY(sid) REFERENCES Sensor(sid)
);
有了这个,我应该创建一个“事件检测机制”,当来自RawTemperature 的温度太高时会发出警报。触发器检查温度是否大于 65 摄氏度,如果是,将适当更新 Event 和 DerivedFrom 表。它将创建一个'Too High Temperature' 类型的Event,confidence 为1。它还表明我们可以假设没有并发问题。
为了解决这个问题,我尝试了这个想法(有点伪代码):
CREATE TRIGGER TemperatureHigh
AFTER INSERT
ON RawTemperature FOR EACH ROW
BEGIN
UPDATE Event
SET activity = ‘Too High Temperature’
INSERT INTO DerivedFrom(eid) VALUES (LAST_INSERT_ID())
WHERE temperature > 65;
END;
但这给了我错误并且根本不起作用。那么如何正确使用触发器来完成此任务呢?
【问题讨论】: