概述
1.创建商品价格修改记录表:price_log,表结构如下:
列名 | 数据类型 | 是否为空 | 其他约束 | 说明 |
id | INT | NOT | 自动增长,主键 | 记录号 |
product_id | INT UNSIGNED | NOT | 参照product表的product_id,删除级联更新级联 | 产品号 |
price | DECIMAL(10,2) | 价格 | ||
update_time | TIMESTAMP | NOT | 默认值为修改时间 | 更新时间 |
CREATE TABLE price_log(
id INT not null PRIMARY KEY auto_increment,
product_id int UNSIGNED not null,
price DECIMAL(10,2),
update_time TIMESTAMP not null DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY(product_id) REFERENCES product(product_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
2.创建触发器,当更改商品价格(price列)时,记录价格
创建触发器,当更改商品product表的价格(price列)时,要将老的价格记录在一个名为price_log的表中。
相关表结构:
1、商品表:product
2、商品价格记录表:price_log
delimiter $
CREATE TRIGGER BEFORE_update_price
BEFORE UPDATE
ON product
FOR EACH ROW
BEGIN
if(old.price<>new.price) THEN
INSERT price_log(product_id,price)
VALUES(old.product_id,old.price);
END IF;
END $
delimiter ;
3. SQL触发器:插入新员工时,同步更新部门表相应人数
创建触发器,插入新员工时,同步更新部门表相应人数。
相关表结构:
1、员工表:employee
2、部门表:department
delimiter $$
create TRIGGER t1
AFTER INSERT on employee
FOR EACH ROW
BEGIN
update department
set emp_num = coalesce(emp_num,0)+1 where dept_id = new.dept_id;
END $$
delimiter;
4.创建触发器,删除学生数据时,将删除的数据备份到数据表student_bf,以备误删除时进行数据恢复。
delimiter $
create trigger delete_stu
before delete on student
for each row
begin
insert student_bf select * from student where sno=old.sno;
end $
delimiter ;
5.创建触发器,插入学生成绩时,限制必须在0-100之间。如果不在0-100之间,设置为0.
delimiter $
create trigger ss
before insert on sc
for each row
begin
if new.grade<0 or new.grade>100 then
set new.grade=0;
end if;
end $
delimiter;
6.创建存储过程:total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)
要求:根据输入的订单编号(order_id),返回订单总金额(total_money),顾客编号(customer_id)。
订单表:orders如下:
delimiter $
create procedure total_order(in orderid int,out totals numeric(9,2),out cid int)
begin
select total_money,customer_id from orders
where order_id=orderid
into totals,cid;
end $
delimiter ;
7. 建立存储过程show_grade:根据学号,课程名参数,返回学生的成绩。
delimiter $
create procedure show_grade(in ssno char(7),in scname varchar(20),out gg smallint)
begin
select grade from sc,course
where sno=ssno and sc.cno = course.cno and cname=scname
into gg;
end $
DELIMITER;
8.建立存储函数show_grade:根据课程号,返回该课程的平均成绩(保留两位小数)。
delimiter $
create function show_grade(ccno char(10))
returns decimal(10,2) deterministic
begin
return(select avg(grade) from sc
where cno=ccno);
end $
delimiter ;
-- 保留两位小数 用convert(),round(a,x) cast(xx as decimal(10,2))
-- 要注意题目是存储函数!!!不是存储过程...
最后
以上就是直率鸡为你收集整理的数据库练习--触发器与存储过程(复习)的全部内容,希望文章能够帮你解决数据库练习--触发器与存储过程(复习)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复