数据库-触发器


一、实验目的与要求

掌握触发器的工作原理、定义及操作方法

二、实验内容

1.自动保存对所有表(至少fruits表和customers表)的插入、更新、删除操作到opertaion表中。

①增加opertaion表
在这里插入图片描述
源码:

CREATE TABLE opertaion(
       id  INT(11) NOT NULL UNIQUE AUTO_INCREMENT, 
       tablename VARCHAR(50) NOT NULL,  
       opname VARCHAR(50) NOT NULL,
       optime DATETIME NOT NULL,
       PRIMARY KEY (id) 
);

② 创建基于fruits表和customers表的插入、更新、删除触发器,该类触发器的功能是在执行相关操作时把操作相关信息写入opertaion表中。例如在fruits表中成功插入一项新的元组后,在opertaion表中自动增加一个元组,该元组描述了是对fruits表进行了插入操作。
源码:
创建fruits表增加事件对应的触发器insert_fruits

CREATE TRIGGER insert_fruits AFTER INSERT ON fruits FOR EACH ROW
     INSERT INTO operation(tablename,opname,optime)
     VALUES('fruits','add a fruit',NOW());

创建fruits表更新事件对应的触发器update_fruits

CREATE TRIGGER update_fruits AFTER UPDATE ON fruits FOR EACH ROW
     INSERT INTO opertaion(tablename,opname,optime)
     VALUES('fruits','update a fruit',NOW());

创建fruits表删除事件对应的触发器update_fruits

CREATE TRIGGER delete_fruits AFTER DELETE ON fruits FOR EACH ROW
     INSERT INTO opertaion(tablename,opname,optime)
     VALUES('fruits','delete a fruit',NOW());

创建customers表增加事件对应的触发器insert_customers

CREATE TRIGGER insert_customers AFTER INSERT ON customers FOR EACH ROW
     INSERT INTO opertaion(tablename,opname,optime)
     VALUES('customers','add a customers',NOW());

创建customers表更新事件对应的触发器update_customers

CREATE TRIGGER update_customers AFTER UPDATE ON customers FOR EACH ROW
     INSERT INTO opertaion(tablename,opname,optime)
     VALUES('customers','update a customers',NOW());

创建customers表删除事件对应的触发器update_customers

CREATE TRIGGER delete_customers AFTER DELETE ON customers FOR EACH ROW
     INSERT INTO opertaion(tablename,opname,optime)
     VALUES('customers','delete a customers',NOW());

测试源码:
对于fruits:

INSERT
INTO  fruits (f_id,s_id,f_name,f_price)
VALUES ('z1',107,'apple',6.2);

UPDATE fruits
SET f_price=6.6
WHERE f_id='z1';

DELETE FROM fruits
WHERE f_id='z1';

对于customers表:

INSERT
INTO  customers (c_id,c_name)
VALUES (20000,'林大大');

UPDATE customers
SET c_name='林小小'
WHERE c_id='20000';

DELETE FROM customers
WHERE c_id='20000';

运行测试结果截图:

在这里插入图片描述

2.在fruits表中增加一个属性quantity(库存商品数量) ,数据类型int(5),默认值为1000

源码:

ALTER TABLE fruits ADD quantity INT(5) DEFAULT(1000);

运行测试结果截图:
在这里插入图片描述

3. 创建触发器实现当客户下订单后,fruits表对应此商品的数量自动的发生变化(减少或增加)

具体要求:
①在orderitems表中修改某个订单的商品数量后时, fruits表对应此商品的数量发生相应的改变。
②在orderitems表中增加一个购买详单(增加一个元组)时, fruits表对应此商品的数量发生相应的改变。

源码:
创建orderitems表更新事件对应的触发器update_orderitems

CREATE TRIGGER update_orderitems AFTER UPDATE ON orderitems FOR EACH ROW
    UPDATE fruits 
SET quantity=quantity+old.quantity-new.quantity 
WHERE f_id=new.f_id;

创建orderitems表添加事件对应的触发器add_orderitems

CREATE TRIGGER add_orderitems AFTER INSERT ON orderitems FOR EACH ROW
    UPDATE fruits 
    SET quantity=quantity-new.quantity 
WHERE f_id=new.f_id;

运行测试结果截图:
在这里插入图片描述
在这里插入图片描述


总结

1.实验中遇到的问题及解决过程
暂无

2.实验中产生的错误及原因分析
在设置触发器的时候,我原本都是写id为1,这就造成了无论你是添加还是更新你的id都是1,而且你只能进行一次操作,这就造成了所谓的主键冲突,后来我把触发器修改后就可以了。
我觉得产生错误的原因可能是思考的不够全面,而且在发生主键冲突后,也没往触发器里去深究。

3.实验体会和收获。
对于触发器的使用有了更深刻的认识。

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值