文章目录
一、实验目的与要求
掌握触发器的工作原理、定义及操作方法
二、实验内容
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.实验体会和收获。
对于触发器的使用有了更深刻的认识。