1.1

(多选题)以下关于触发器说法正确的有 ABCD

• A、
同一表不能创建两个相同触发时间、触发事件的触发程序(5.7.2版本之后可以)

• B、
不支持在视图上定义触发器

• C、
触发器中可以调用存储过程和存储函数

• D、
如果before触发器失败,则MySQL将不执行请求的操作

1.2

以下关于MySQL8.0触发器说法正确的有 ABD

A、
A. 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用

B、
B. MySQL目前只支持FOR EACH ROW行级触发器,没有支持语句级触发器

C、
C. OLD列(旧值)不但可以引用,还可以修改

D、
D. 触发器执行的顺序是BEFORE触发器、表操作、AFTER触发器

1. 3

以下哪些语句会触发表上的INSERT触发器? ABC

A、
A. INSERT

B、
B. REPLACE

C、
C. LOAD DATA

D、
D. UPDATE

1.4

下面关于游标的说法正确的是: ABD

A.利用基于变量的select into语句,仅能处理一条记录的数据。通过游标(或光标),能够对查询的结果集进行循环处理。

B.MySQL游标为只读,不可滚动和敏感。

C.游标只允许应用程序对查询语句select返回的行结果集中每一行进行相同的操作,而不能进行不同的操作。

D.游标必须在声明处理程序之前被声明,并且声明变量和条件之后。

1.5

下面关于触发器说法正确的是() ABCD

A、
A. 在INSERT触发程序中,仅能使用NEW.col_name,没有旧值。

B、
B. 在DELETE触发程序中,仅能使用OLD.col_name,没有新值。

C、
C. 在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的旧值,也能使用NEW.col_name来引用更新后的行中的新值。

D、
D. 使用OLD和NEW关键字,能够访问受触发程序影响的行中的字段值。

2.1

  1. 先在account表中执行更新语句,将最后活跃日期和当前时间相距超过三年的所有账户的Status属性设置为“不活跃”。
UPDATE account a SET a.`STATUS` = '不活跃' WHERE DATE_ADD(a.LAST_ACTIVITY_DATE, INTERVAL 3 YEAR) < CURDATE();
  1. 然后,在acc_transaction上定义一个AFTER INSERT触发器,触发器名为“d_newTransaction”,当对acc_transaction表执行任何插入操作后被启动,将该账户在account表中的Status属性设置为 “正常”。

正确答案:

DROP TRIGGER IF EXISTS d_newTransaction;
CREATE TRIGGER d_newTransaction AFTER INSERT ON acc_transaction FOR EACH ROW
BEGIN
UPDATE account a
SET a.`STATUS` = '正常'
WHERE a.ACCOUNT_ID = new.ACCOUNT_ID;
END;
update account a set a.STATUS = '不活跃'
where date_add(a.last_activity_Date, interval 3 year) < curdate();
select * from account;
select  * from acc_transaction;drop trigger if exists d_newTransaction;
delimiter $$
create trigger d_newTransaction
after insert
on acc_transaction
for each row
begin
update account set account.STATUS = '正常'
where account.account_id = new.account_id;
end $$
delimiter ;insert into acc_transaction (TXN_ID, AMOUNT, TXN_DATE, TXN_TYPE_CD, ACCOUNT_ID, EXECUTION_BRANCH_ID, TELLER_EMP_ID)
values(28, 1, curdate(), 'CD', 1,1,1);
select * from account;

2.2

创建存储过程updateCloseDate,该存储过程更新account表中的关闭日期(CLOSE_DATE),根据产品编号做不同的更新操作,要求使用游标:

  1. 对产品编号对应类型为存款的账户(即产品编号PRODUCT_CD对应PRODUCT_TYPE_CD为ACCOUNT),如开户日期(OPEN_DATE)在2015-01-01之前(含)的,设置其关闭日期(CLOSE_DATE)为开户日期加20年,否则为开户日期加30年;
  2. 对产品编号对应类型为贷款的账户(即产品编号PRODUCT_CD对应PRODUCT_TYPE_CD为LOAN),如可用余额(AVAIL_BALANCE)少于100000的(含),设置其关闭日期(CLOSE_DATE)为开户日期加20年,否则为开户日期加30年;
  3. 对产品编号对应类型为保险的账户(即产品编号PRODUCT_CD对应PRODUCT_TYPE_CD为INSURANCE),设置其关闭日期(CLOSE_DATE)为开户日期加15年。
DROP PROCEDURE IF EXISTS updateCloseDate;
CREATE PROCEDURE updateCloseDate ()
BEGINDECLARE id INT;DECLARE type VARCHAR ( 255 );DECLARE opend DATE;DECLARE closed DATE;DECLARE bal DECIMAL ( 12, 4 );DECLARE cur CURSOR FOR SELECTa.ACCOUNT_ID,p.PRODUCT_TYPE_CD,a.OPEN_DATE,a.CLOSE_DATE,a.AVAIL_BALANCE FROMaccount a,product p WHEREa.PRODUCT_CD = p.PRODUCT_CD;DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur;OPEN cur;REPEATFETCH cur INTO id, type, opend, closed, bal;CASE type WHEN 'ACCOUNT' THENUPDATE account SET CLOSE_DATE = DATE_ADD(opend, INTERVAL IF (opend <= '2015-01-01', 20, 30)YEAR)WHERE ACCOUNT_ID = id;WHEN 'LOAN' THENUPDATE account SET CLOSE_DATE = DATE_ADD( opend, INTERVAL IF ( bal <= 100000, 20, 30 ) YEAR ) WHERE ACCOUNT_ID = id;WHEN 'INSURANCE' THENUPDATE account SET CLOSE_DATE = DATE_ADD( opend, INTERVAL 15 YEAR ) WHERE ACCOUNT_ID = id;END CASE;UNTIL 0 END REPEAT;CLOSE cur;END;CALL updateCloseDate ();SELECT a.ACCOUNT_ID, p.PRODUCT_TYPE_CD, a.OPEN_DATE, a.CLOSE_DATE, a.AVAIL_BALANCE
FROM account a, product p
WHERE a.PRODUCT_CD = p.PRODUCT_CD
ORDER BY a.ACCOUNT_ID;
drop procedure  if exists updateCloseDate;
delimiter $$
create procedure updateCloseDate()
BEGINdeclare ab decimal(12,4);declare pc varchar(10);declare cd date;declare od date;declare ptc varchar(255);declare cur cursor for select avail_balance, product_cd, close_date, open_date, product_type_cdfrom account join product using(product_cd);DECLARE exit HANDLER FOR NOT FOUND CLOSE cur;open cur;repeatfetch cur into ab, pc, cd, od, ptc;update account set account.close_date = case when ptc = 'ACCOUNT'THEN case when od <= '2015-01-01'then open_date + interval 20 yearelse  open_date + interval 30 yearend when ptc = 'LOAN'THEN case when ab <= 100000then open_date + interval 20 yearelse  open_date + interval 30 yearend else close_date = open_date + interval 15 yearend ;until null end repeat;close cur;
END $$
delimiter ;
call updateCloseDate();select * from account;

2.3

在acc_transaction上定义触发器t_newTransaction,当往acc_transaction中插入一条数据时,依 据账户编号(ACCOUNT_ID)更新account表中对应账户的可用余额(AVAIL_BALANCE)和最后 活跃日期(LAST_ACTIVITY_DATE):

  1. 如果插入数据的交易类型编码(TXN_TYPE_CD)为CD、TT、IC、LI则设置可用余额为当前可用余额加上交易金额、最后活跃日期为当前日期
  2. 如果插入数据的交易类型编码(TXN_TYPE_CD)为CW、TF则设置可用余额为当前可用余额 减去交易金额、最后活跃日期为当前日期;如当前可用余额减去交易金额小于0,则撤销对 acc_transaction此条数据的插入
DROP TRIGGER IF EXISTS t_newTransaction;
CREATE TRIGGER t_newTransaction BEFORE INSERT ON acc_transaction FOR EACH ROW
BEGINDECLARE bal INT;IFnew.TXN_TYPE_CD = 'CW' OR new.TXN_TYPE_CD = 'TF' THENSELECT a.AVAIL_BALANCE INTO bal FROM account a WHERE a.ACCOUNT_ID = new.ACCOUNT_ID;IFbal < new.AMOUNT THEN DELETE FROM acc_transactionWHERE TXN_ID = new.TXN_ID; ELSE UPDATE account a SET a.AVAIL_BALANCE = a.AVAIL_BALANCE - new.AMOUNT, a.LAST_ACTIVITY_DATE = DATE(new.TXN_DATE) WHERE a.ACCOUNT_ID = new.ACCOUNT_ID; END IF; ELSE UPDATE account a SET a.AVAIL_BALANCE = a.AVAIL_BALANCE + new.AMOUNT, a.LAST_ACTIVITY_DATE = DATE(new.TXN_DATE) WHERE a.ACCOUNT_ID = new.ACCOUNT_ID; END IF;
END;
drop trigger t_newTransaction;
delimiter $$
create trigger t_newTransaction
after insert
on acc_transaction
for each row
beginupdate accountset account.avail_balance = casewhen (new.txn_type_cd = 'CD' or new.txn_type_cd = 'TT'or new.txn_type_cd = 'IC' or new.txn_type_cd = 'LI')then account.avail_balance + new.amountwhen (new.txn_type_cd = 'CW' or new.txn_type_cd = 'TF')then account.avail_balance - new.amountend where account.account_id = new.account_id;update account set account.last_activity_date =case when(account.avail_balance >= 0) then now()else account.last_activity_dateendwhere account.account_id = new.account_id;update account set avail_balance  = case  when(account.avail_balance < 0)  then avail_balance + new.amountelse avail_balanceendwhere account.account_id = new.account_id;if (select avail_balance from account where account.account_id = new.account_id  < 0)then delete from acc_Transactionwhere acc_Transaction.txn_id = new.txn_id;end if;
end$$
delimiter ;

2.4

新建teams表和players表


– Table structure for teams


DROP TABLE IF EXISTS teams;
CREATE TABLE teams(
id int NOT NULL,
name varchar(20) NOT NULL,
addres varchar(100) NOT NULL,
nums int NOT NULL,
PRIMARY KEY (id)
);INSERT INTO `teams` ( `id`, `name`, `addres`, `nums` )
VALUES( 1, '火箭', '休斯顿', 3 );
INSERT INTO `teams` ( `id`, `name`, `addres`, `nums` )
VALUES( 2, '湖人', '洛杉矶', 2 );
INSERT INTO `teams` ( `id`, `name`, `addres`, `nums` )
VALUES( 3, '勇士', '金洲', 1 );DROP TABLE IF EXISTS `players`;
CREATE TABLE `players` (
`id` int NOT NULL, `name` varchar(100) NOT NULL,
`team_id` int NOT NULL,
`salary` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`)
);

请在players表中创建如下两个触发器:

  1. before触发器:插入player表之前,检测该条插入数据的salary是不是小于10,000,如果是则增大10倍;
  2. after触发器:每添加一条数据,就更新team表中nums值(该队下的总人数)。
    输入以下SQL语句,查看效果。
insert into players VALUES(2,"科比",2,500000);
insert into players VALUES(3,"艾灵顿",2,100.0);
insert into players VALUES(4,"麦迪",1,30000.0);
insert into players VALUES(5,"姚明",1,30000.0);
insert into players VALUES(6,"沃尔",1,5000.0);
insert into players VALUES(7,"戈登",1,6000.0);
最后请运行查看结果: SELECT * FROM teams;
DROP TRIGGER IF EXISTS `before_inseret`;
CREATE TRIGGER `before_inseret` BEFORE INSERT ON `players` FOR EACH ROW
BEGINIFnew.salary < 10000 THENSET new.salary = 10 * new.salary;END IF;
END;2.
DROP TRIGGER IF EXISTS `insert_player`;
CREATE TRIGGER `insert_player` AFTER INSERT ON `players` FOR EACH ROW
BEGINUPDATE teams SET nums = nums + 1 WHERE teams.id = new.team_id;
END;
drop trigger BEFORE_INSERT_TRIGGER;
delimiter $$
create trigger BEFORE_INSERT_TRIGGER
BEFORE insert
on players
for each row
begin
if ( new.salary < 10000)then set new.salary = new.salary * 10;
end if;
end$$
delimiter ;drop trigger AFTER_INSERT_TRIGGER;
delimiter $$
create trigger AFTER_INSERT_TRIGGER
AFTER insert
on players
for each row
beginupdate teamsset teams.nums = teams.nums + 1;end$$
delimiter ;

DataBase Experiment HW07相关推荐

  1. linux下mysql设置关联_Linux下mysql安装与配置

    1.安装 epel 源 [root@qfedu.com~]#yum-yinstallepel-release.noarch 2.安装 MySQL Repository [root@qfedu..com ...

  2. Python对MySQL数据库的创建,增删改查操作

    import pymysql#连接数据库 conn = pymysql.connect(host='127.0.0.1',user='root',password='SQL123',database= ...

  3. ASP.NET的属性绑定、表达式绑定、集合绑定、方法绑定、DropDownList集合绑定、DataList绑定、GridView绑定

    属性绑定 .aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defau ...

  4. ASP.NET的ADO(ActiveX Data Objects)

    command添加 .aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.W ...

  5. Mysql数据库和数据表的创建和信息更改的常用指令

    文章目录 数据库和数据表的创建和信息更改 后续小实验做准备 一. 关于数据库和数据表的其它操作 1)数据库 ①创建数据库 ②显示目前所有的数据库 ③数据库重命名 2.1 先创建新库: 2.2 使用`R ...

  6. 查看SQL Server Resource Database以及修改系统表

    参考文献: SQL 2005修改系统表 SQL Server 2005中修改系统表的方法 如何登入DAC(SQL Server 2005) ResourceDB Location Changes Re ...

  7. 生物信息学数据库资源 {#database}

    目录 ##前言 参考基因组版本 {#genome-version} NCBI Ensembl UCSC ENCODE GENCODE TCGA 1000 GENOME ##前言 做数据分析常常会需要用 ...

  8. Material Recognition in the Wild with the Materials in Context Database论文笔记

    摘要: 在现实世界中,材料识别是一个有挑战性的任务.真实世界中的材料是有很丰富的表面纹理.几何形状.光照条件和杂波.这些因素使的这个问题难以处理.在这边论文,我们提出了一个新的.大规模的.在户外的材料 ...

  9. 【翻译】Database Workload Capacity Planning using Time Series Analysis and Machine Learning

    [翻译]Database Workload Capacity Planning using Time Series Analysis and Machine Learning 基于时间序列分析和机器学 ...

最新文章

  1. Lotusscript代理调用正则表达式过滤掉html代码,获取notesRichTextItem内容信息的方法...
  2. Centos 6 安装 配置 oracle11g R2
  3. mysql crash 如何定位_MySQL实例crash的案例详细分析
  4. oracle11g sp 1503,Oracle11g操作ASM权限问题
  5. VTK:可视化之ProteinRibbons
  6. webstrom中的快捷键
  7. [JavaWeb-MySQL]数据库的备份和还原
  8. socket和http间的区别
  9. IPLAT62--后台返回提示参数
  10. 【论文笔记】Simple and Deep Graph Convolutional Networks
  11. [转]【分享】浅谈 JavaScript 在多交互站点中的工作方式
  12. a类计算机机房验收规范,电子信息系统机房设计规范 GB50174-2017
  13. 数据分析 超市条码_阜康市超市存包柜人脸识别 - 阜康办公、文教
  14. 易语言打开c 程序,易语言调用word 易语言按钮打开一个word文档
  15. one algorithm a day keeps the doctor away -- BubbleSort
  16. ll和du显示的文件大小不一致问题研究
  17. 深度学习超分辨率综述阅读笔记(翻译)
  18. 黑马程序员--技术网站网址2
  19. Android Studio 实现跑马灯微项目实例
  20. webpack的摇树、拆包、热更新、按需加载等难点

热门文章

  1. 防伪标签制作制版工艺介绍_防伪常识
  2. 前端技巧——手动调整文字的对齐
  3. Ai 2020最新版下载地址 一键安装Windows
  4. 当不懂某项技术时候,如何面试工程师?
  5. 老旧无线路由器的妙用
  6. 学习笔记 | Apollo Udacity自动驾驶课程笔记——高精度地图、厘米级定位
  7. vscode使用xdebug3进行PHP调试
  8. python npv 计算公式_python – IRR实现中使用的数值方法是什么?
  9. 腾讯云短信服务使用指南
  10. 软件工程 习题三 课后作业(2)