触发器new和old的用法区别

new和old的使用情况:

在对new赋值的时候只能在触发器before中只用,在after中是不能使用的,比如(以下是正确的)。

CREATE TRIGGER updateprice
BEFORE insert
ON consumeinfo
FOR EACH ROW
BEGIN
   set new.金额=0;
END;

这个说明对当前插入数据进行更新的时候使用before先更新完,然后才插入到数据库中的,在after的触发器中,new的赋值已经结束了,只能读取内容。 如果使用after不能使用new赋值,只能取值,否则会出错误,比如

CREATE TRIGGER updateprice
AFTER insert
ON consumeinfo
FOR EACH ROW
BEGIN
    set new.金额=0;
END;

出现这样的错误:

[Err] 1362 - Updating of NEW row is not allowed in after trigger

总结:

new在before触发器中赋值,取值;在after触发器中取值。

new是新插入的数据,old是原来的数据

insert只会有new,代表着要插入的新记录

delete只会有old,代表着要删除的记录
好的,下面是5个例子: 1. 在更新操作后,将新值和旧值进行比较,如果不同则记录日志: ``` CREATE OR REPLACE TRIGGER trg_emp_update AFTER UPDATE ON employee FOR EACH ROW BEGIN IF :NEW.salary != :OLD.salary THEN INSERT INTO emp_log (emp_id, action, log_time) VALUES (:OLD.id, 'Salary updated', SYSDATE); END IF; END; / ``` 2. 在插入操作前,检查新值是否已经存在,并防止重复插入: ``` CREATE OR REPLACE TRIGGER trg_emp_insert BEFORE INSERT ON employee FOR EACH ROW BEGIN IF EXISTS (SELECT 1 FROM employee WHERE id = :NEW.id) THEN RAISE_APPLICATION_ERROR(-20001, 'Employee already exists'); END IF; END; / ``` 3. 在删除操作后,将被删除的记录保存到历史表中: ``` CREATE OR REPLACE TRIGGER trg_emp_delete AFTER DELETE ON employee FOR EACH ROW BEGIN INSERT INTO emp_history (id, name, age, gender, deleted_time) VALUES (:OLD.id, :OLD.name, :OLD.age, :OLD.gender, SYSDATE); END; / ``` 4. 在更新操作前,检查是否有其他员工使用了相同的邮箱地址: ``` CREATE OR REPLACE TRIGGER trg_emp_update BEFORE UPDATE ON employee FOR EACH ROW DECLARE cnt NUMBER; BEGIN SELECT COUNT(*) INTO cnt FROM employee WHERE email = :NEW.email AND id != :OLD.id; IF cnt > 0 THEN RAISE_APPLICATION_ERROR(-20002, 'Email address already in use'); END IF; END; / ``` 5. 在插入操作后,根据新插入的员工信息,自动生成员工编号: ``` CREATE OR REPLACE TRIGGER trg_emp_insert AFTER INSERT ON employee FOR EACH ROW DECLARE max_id NUMBER; BEGIN SELECT MAX(id) INTO max_id FROM employee; :NEW.emp_no := 'EMP' || LPAD(max_id + 1, 5, '0'); END; / ``` 以上是5个触发器的例子,用于演示如何使用NEWOLD关键字来引用触发器所作用的表中的新值和旧值。这些例子只是触发器的冰山一角,实际应用中还有很多其他的用法和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值