mysql触发器更新设置空值而不是预期的数字

时间:2017-07-25 21:41:53

标签: mysql triggers null

我试图创建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行。

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

中的整个示例