数据库实验六

1.创建表SAV1, 记录每个公司所有员工的平均工资,其主要字段包括company_name, avg_salary, 其中company_name为主码。

CREATE TABLE SAV1 (
	company_name VARCHAR (30) NOT NULL,
	avg_salary DECIMAL (8),
	PRIMARY KEY (company_name)
);
INSERT into sav1  (
	SELECT
		company_name,
		AVG(salary) as avg_salary
	FROM
		works
	GROUP BY
		company_name
)

2.在表works上定义一个update触发器trig_update。当修改某个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

CREATE TRIGGER trig_update AFTER UPDATE ON works FOR EACH ROW
BEGIN
	UPDATE SAV1
SET avg_salary = (
	SELECT
		avg(salary)
	FROM
		works
	WHERE
		works.company_name = old.company_name
)
WHERE
	sav1.company_name = old.company_name;
END;

3.修改‘Curry’的工资为19000,观察表SAV1的变化。

SELECT	* FROM	sav1;

UPDATE works
SET salary = 19000
WHERE
	employee_ID = (
		SELECT
			employee_ID
		FROM
			employee
		WHERE
			employee_name = 'Curry'
	);

SELECT	* FROM	sav1;

4.在表works上定义一个insert触发器trig_insert。当插入一个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

CREATE TRIGGER trig_insert AFTER INSERT ON works FOR EACH ROW
BEGIN
	UPDATE sav1
SET avg_salary = (
	SELECT
		AVG(salary)
	FROM
		works
	WHERE
		works.company_name = new.company_name
)
WHERE
	sav1.company_name = new.company_name;
END;

5.插入一个新的员工:ID为319024,姓名为Bob,它居住的城市city是‘Foshan’,街道street是‘Second Road’,工作的公司名为‘Baidu’,工资是18500。观察表SAV1的变化。

SELECT * from sav1;

INSERT INTO employee VALUES(319024,'Bob','Second Road','Foshan');

INSERT INTO works VALUES(319024,'Baidu',18500);

SELECT * FROM sav1;

6.在表works上定义一个delete触发器trig_delete。当删除一个员工的工资后,自动重新计算每个公司的平均工资,并更新到SAV1表中。

CREATE TRIGGER trig_delete AFTER DELETE ON works FOR EACH ROW
BEGIN
	UPDATE sav1
SET avg_salary = (
	SELECT
		AVG(salary)
	FROM
		works
	WHERE
		works.company_name = old.company_name
)
WHERE
	sav1.company_name = old.company_name;
END;

7.在表works中删除姓名为‘MrDeng’的员工的信息。观察表SAV1的变化。

SELECT * FROM sav1;
DELETE
FROM
	works
WHERE
	works.employee_ID = (
		SELECT
			employee_ID
		FROM
			employee
		WHERE
			employee.employee_name = 'MrDeng'
	);
SELECT * FROM sav1;

8.创建一个update_salary的触发器,每次向works表更新数据之后都会向名称为myevent的数据表中插入一条记录,其中myevent表包含三个属性:employee_ID,employee_name和 salary。

CREATE TABLE myevent (
	employee_ID INT NOT NULL,
	employee_name VARCHAR (30),
	salary DECIMAL (8),
	PRIMARY KEY (employee_ID)
);
CREATE TRIGGER update_salary AFTER INSERT ON works FOR EACH ROW
BEGIN
	INSERT INTO myevent
VALUES
	(
		new.employee_ID,
		(
			SELECT
				employee_name
			FROM
				employee
			WHERE
				employee.employee_ID = new.employee_ID
		),
		new.salary
	);
END;

9.插入一个新的员工ID为319025,姓名为‘Cara’,其工作的公司为‘Alibaba’,工资为15000。观察表myevent的变化。

SELECT * FROM myevent;

INSERT INTO employee VALUES(319025,'Cara',null,null);
INSERT INTO works VALUES(319025,'Alibaba',15000);

SELECT * FROM myevent;

10.删除触发器trig_update。

DROP TRIGGER trig_update

11.使用下面两种方式查看触发器的信息:(1)使用SHOW TRIGGERS语句查看触发器的信息;(2)在TRIGGERS表中查看触发器的信息。

SHOW TRIGGERS

思考题:
(1)对于相同的表和相同的事件,能否创建多个触发器?请举例说明。

可以对相同的表和相同的事件创建多个不同名的触发器

(2)是否要及时删除不要需要的触发器?

需要及时删除不需要的触发器,防止在对一个表进行修改是对另一个表产生影响。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值