插入或更新的值过高或过低时的 SQL 触发器

Posted

技术标签:

【中文标题】插入或更新的值过高或过低时的 SQL 触发器【英文标题】:SQL Trigger for when a inserted or updated value is too high or low 【发布时间】:2021-03-03 19:57:09 【问题描述】:

我正在尝试创建一个在插入或更新的汽车价格过高或过低时运行的触发器。 在尝试编译时,它只是说必须在我使用或看到的其他类似方法使用相同方法的地方声明标识符。

CREATE OR REPLACE TRIGGER carlistprice_insert_update 
BEFORE INSERT OR UPDATE ON car
FOR EACH ROW
    WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000)
BEGIN
        IF NEW.carlistprice < 0 THEN
        :NEW.carlistprice := 0;
        END IF;
        IF NEW.carlistprice > 250000 THEN
        :NEW.carlistprice := 250000;
        END IF;
END;
/

我的这个程序基于这段代码,它可以工作并且不需要声明标识符。

CREATE OR REPLACE TRIGGER cust_before_insert
BEFORE INSERT ON customer
FOR EACH ROW
    WHEN(NEW.custname != UPPER(NEW.custname))
BEGIN
    :NEW.custname := UPPER(:NEW.custname);
END;
/

carlistprice 是我的一张表中的有效列

【问题讨论】:

【参考方案1】:WHEN 子句中,NEW(以及OLD)没有冒号。 其他地方必须以冒号开头

所以:

CREATE OR REPLACE TRIGGER carlistprice_insert_update 
  BEFORE INSERT OR UPDATE ON car
  FOR EACH ROW
WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000)  -- no colon here
BEGIN
  IF :NEW.carlistprice  < 0 THEN                   -- colon here
     :NEW.carlistprice := 0;                       -- and here
  END IF;

  IF :NEW.carlistprice  > 250000 THEN              -- and here
     :NEW.carlistprice := 250000;                  -- and here
  END IF;
END;
/

【讨论】:

我非常接近,感谢您指出这一点。感谢您的回复! 请注意,这通常会使最终用户感到困惑,因为他们在屏幕上输入 26,000,然后返回 25,000。如果您在前端也有验证,那么也许不是触发器,更好的数据库方法不是触发器,而是确保没有任何东西漏掉的约束,即alter table car add constraint car_chk check ( carlistprice between 0 and 25000 )

以上是关于插入或更新的值过高或过低时的 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

电池NTC(温度过高或者过低停止充电)

荣耀v7pro使用时间过长怎么解决会不会突然重启

可否有安卓闪退过后几秒自动重启的

深度强化学习reward一直震荡波动不上升的原因

SQL Server 根据字段的值触发插入和/或更新的记录

如果插入的值与唯一约束冲突,则 SQL 触发器在插入时更新字段