我是靠谱客的博主 直率鸡,最近开发中收集的这篇文章主要介绍数据库练习--触发器与存储过程(复习),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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))
-- 要注意题目是存储函数!!!不是存储过程...

最后

以上就是直率鸡为你收集整理的数据库练习--触发器与存储过程(复习)的全部内容,希望文章能够帮你解决数据库练习--触发器与存储过程(复习)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部