我试图创建mysql触发器,它应该从一个表(raw_us)中获取新插入的数字,将它与最后一个记录进行比较(新值高于最后一个,或低于最后一个),索引它们按范围分为值-10到10并放入另一个表(indexed_us)。我的数据库表:
CREATE TABLE raw_us(rdate DATE,pmi DECIMAL(3,2));
CREATE TABLE indexed_us(idate DATE, ipmi DECIMAL (2,2));
INSERT INTO raw_us(rdate,pmi) VALUES(20000101, 50);
INSERT INTO indexed_us(idate,ipmi) VALUES(20000101, 5);
我编写了触发器代码来整理新的原始数据(插入表raw_us列pmi) - 是新的' pmi'值大于或小于最后一个,然后检查新原始数据所属的范围,然后根据特定范围将特定数字插入indexed_us表impi列。这是我的触发器代码:
DELIMITER //
CREATE TRIGGER ipmiUS BEFORE INSERT ON raw_us
FOR EACH ROW
BEGIN
DECLARE @old_pmi int;
SET @old_pmi = (select pmi from raw_us where rdate = MAX(rdate));
IF (@old_pmi < NEW.pmi) THEN
IF (50 < NEW.pmi) AND (NEW.pmi < 60)
THEN INSERT INTO indexed_us(idate,ipmi) VALUES (new.date,6);
ELSEIF (60 < NEW.pmi) AND (NEW.pmi < 70)
THEN INSERT INTO indexed_us(idate,ipmi) VALUES (new.date,7);
END IF;
ELSEIF (@old_pmi > NEW.pmi) THEN
IF (50 > NEW.pmi) AND (NEW.pmi > 60)
THEN INSERT INTO indexed_us(idate,ipmi) VALUES (new.date,5);
ELSEIF (40 > NEW.pmi) AND (NEW.pmi > 50)
THEN INSERT INTO indexed_us(idate,ipmi) VALUES (new.date,4);
END IF;
END IF;
END; //
DELIMITER ;
问题是在将触发器更新为“插入前”之后并在IF语句范围内修复&#39; IF(number&gt; NEW.pmi)AND(NEW.pmi&gt; number)&#39;我只是得到错误: 您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便使用“DELIMITER //在创建每个行的原始数据之前创建TRIGGER ipmi的正确语法”&#39;在第1行。
答案 0 :(得分:0)
您很可能对IF
表达式有疑问。你在&#34;范围内写#34; (30 < NEW.pmi < 40)
以一种不会产生预期结果的方式。
为了说清楚,试试这个:
SELECT
30 < 1 < 40 ;
你得到回应:
| 30 < 1 < 40 | | ----------: | | 1 |
这是因为MySQL实际上在计算:
SELECT
(30 < 1) < 40 ;
(30 < 1)
的结果为false
,由MySQL表示为0
,然后(0 < 40)
为true
,并表示为{{1} }}
您需要重写这样的条件:
1
另外,请考虑到您考虑了不的一些极端情况。例如,当IF (30 < NEW.pmi) AND (NEW.pmi < 40) THEN
-- whatever
...
时,您可能希望发生某些事情。检查范围时,最好进行比较,如:
40 = NEW.pmi
(注意`(lower_bound <= value) AND (value < upper_bound)`
和<=
)。
另请注意,您可以写(同时注意&lt; =和&lt; = )
<
使用等效形式
(lower_bound <= value) AND (value <= upper_bound)
当您使用value BETWEEN lower_bound AND upper_bound
或INTEGER
时,这只是一种很好的做法,如果您使用DECIMAL
,不是。
请参阅 dbfiddle here
中的整个示例