第65练 项目九 触发器概述和创建触发器《数据库原理与应用技术-MySQL》(河北科学技术出版社)一课一练(河北省)

2026-05-07
| 2份
| 9页
| 44人阅读
| 0人下载

内容正文:

编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第65练,内容是触发器概述和创建触发器。 《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第65练 触发器概述和创建触发器 一、单项选择题 1. 数据表:学生表 student (学号 s_id, 姓名 s_name, 年龄 s_age) 下列创建触发器的 SQL 语句,语法顺序完全正确的是( ) A. CREATE TRIGGER tri_stu_insert ON student BEFORE INSERT FOR EACH ROW SET @count=@count+1; B. CREATE TRIGGER tri_stu_insert BEFORE INSERT ON student FOR EACH ROW SET @count=@count+1; C. CREATE TRIGGER tri_stu_insert INSERT BEFORE ON student FOR EACH ROW SET @count=@count+1; D. CREATE TRIGGER BEFORE INSERT tri_stu_insert ON student FOR EACH ROW SET @count=@count+1; 【答案】B 【解析】语法顺序:CREATE TRIGGER 触发器名 → 触发时间(BEFORE/AFTER) → 触发事件 → ON 表名 → FOR EACH ROW → 主体。A 错误:ON 表名应在触发事件之后;C 错误:触发时间与事件顺序颠倒;D 错误:触发器名必须紧跟CREATE TRIGGER关键字。 2.数据表:成绩表 score (学号 s_id, 科目 sub, 分数 mark) 下列触发器创建语句中,存在核心语法错误的是( ) A. CREATE TRIGGER tri_score_update AFTER UPDATE ON score FOR EACH ROW SET @update_time=NOW(); B. CREATE TRIGGER tri_score_delete AFTER DELETE ON score FOR EACH ROW DELETE FROM log WHERE s_id=OLD.s_id; C. CREATE TRIGGER tri_score_insert BEFORE INSERT ON score SET @insert_count=@insert_count+1; D. CREATE TRIGGER tri_score_check BEFORE INSERT ON score FOR EACH ROW IF NEW.mark<0 THEN SET NEW.mark=0; END IF; 【答案】C 【解析】MySQL 触发器强制要求包含FOR EACH ROW子句(行级触发),省略则直接判定为语法错误。A、B、D 均包含完整子句;C 省略FOR EACH ROW。 3.数据表:订单表 order (订单号 o_id, 用户 id u_id, 金额 amount, 下单时间 o_time) 关于触发事件的写法,下列语法正确的是( ) A. CREATE TRIGGER tri_order_insert BEFORE INSERT INTO ON order FOR EACH ROW ...; B. CREATE TRIGGER tri_order_change BEFORE INSERT,UPDATE ON order FOR EACH ROW ...; C. CREATE TRIGGER tri_order_delete AFTER DELETE ON order FOR EACH ROW ...; D. CREATE TRIGGER tri_order_modify AFTER MODIFY ON order FOR EACH ROW ...; 【答案】C 【解析】触发事件仅支持INSERT、UPDATE、DELETE三种,且单一触发器只能关联一个事件。A 错误:INSERT INTO是插入语句,不是触发事件;B 错误:不能同时关联 INSERT 和 UPDATE 两个事件;D 错误:MODIFY是修改表结构的关键字,不是触发事件。 4.数据表:商品表 goods (商品 id g_id, 商品名 g_name, 库存 stock, 价格 price) 触发器主体包含多条 SQL 语句时,下列写法正确的是( ) A. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); B. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW BEGIN UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); END; C. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW ( UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); ); D. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW {UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW());}; 【答案】B 【解析】当触发器主体包含多条 SQL 语句时,必须使用 **BEGIN...END复合语句 ** 包裹。A 错误:多条语句未包裹,语法错误;C 错误:不能用小括号包裹;D 错误:不能用大括号包裹。 5.数据表:用户表 user (用户 id u_id, 用户名 u_name, 积分 points) 下列触发器语句中,违反触发器使用原则的是( ) A. CREATE TRIGGER tri_user_insert AFTER INSERT ON user FOR EACH ROW INSERT INTO user_log VALUES(NEW.u_id,'注册',NOW()); B. CREATE TRIGGER tri_user_update BEFORE UPDATE ON user FOR EACH ROW IF NEW.points<0 THEN SET NEW.points=0; END IF; C. CREATE TRIGGER tri_user_delete AFTER DELETE ON user FOR EACH ROW DELETE FROM order WHERE u_id=OLD.u_id; D. CREATE TRIGGER tri_user_points AFTER UPDATE ON user FOR EACH ROW UPDATE user SET points=points+10 WHERE u_id=NEW.u_id; 【答案】D 【解析】核心使用原则:触发器的执行语句不能对触发器所针对的表进行修改操作,否则会导致无限死循环。D 选项在 user 表的 UPDATE 触发器中再次 UPDATE user 表,严重违反规则;A、B、C 均操作其他表或修改 NEW 值(BEFORE 触发器允许修改 NEW 值)。 6.数据表:班级表 class (班级 id c_id, 班级名 c_name, 人数 num) 关于触发器数量限制,下列说法正确的是( ) A. 可以在 class 表上创建 2 个 BEFORE INSERT 触发器 B. class 表最多支持 3 种触发器 C. 每个表的每个事件每次只允许有一个触发器 D. 可以创建一个同时关联 class 表和 student 表的触发器 【答案】C 7.数据表:图书表 book (图书 id b_id, 书名 b_name, 价格 price, 库存 stock) 需要在插入图书数据前验证价格是否大于 0,下列触发器写法正确的是( ) A. CREATE TRIGGER tri_book_check AFTER INSERT ON book FOR EACH ROW IF NEW.price<=0 THEN SET NEW.price=10; END IF; B. CREATE TRIGGER tri_book_check BEFORE INSERT ON book FOR EACH ROW IF NEW.price<=0 THEN SET NEW.price=10; END IF; C. CREATE TRIGGER tri_book_check BEFORE INSERT ON book FOR EACH ROW IF OLD.price<=0 THEN SET OLD.price=10; END IF; D. CREATE TRIGGER tri_book_check AFTER INSERT ON book FOR EACH ROW IF OLD.price<=0 THEN SET OLD.price=10; END IF; 【答案】B 【解析】触发时间选择规则:验证或修改新数据必须使用 BEFORE 触发器(AFTER 触发器中数据已写入磁盘,无法修改 NEW 值)。A、D 错误:使用 AFTER 触发器无法修改插入数据;C 错误:INSERT 操作中没有 OLD 值(OLD 仅代表修改前的行,用于 UPDATE/DELETE)。 8.数据表:员工表 emp (员工 id e_id, 姓名 e_name, 部门 dept, 工资 salary) 下列关于触发器执行方式的 SQL 语句,正确的是( ) A. CALL tri_emp_insert; B. EXEC tri_emp_update; C. INSERT INTO emp(e_name,dept) VALUES('张三','技术部'); D. SELECT * FROM emp WHERE dept='技术部'; 【答案】C 【解析】触发器是事件驱动的特殊存储过程,不能用 CALL/EXEC 手动调用,只能在对表执行 INSERT/UPDATE/DELETE 操作时自动触发。A、B 错误:不能手动调用触发器;D 错误:SELECT 查询操作不会触发任何触发器。 9.数据表:日志表 log (日志 id l_id, 操作类型 op_type, 操作时间 op_time) 若向 log 表插入数据时触发器执行失败,下列说法正确的是( ) A. 插入的数据仍然会保留在 log 表中 B. 触发器执行失败不影响原操作的结果 C. 原插入操作的结果会被完全撤销 D. 数据库会自动重试执行触发器 3 次 【答案】C 【解析】触发器核心特性:触发器发生错误时,整个事务(包括原操作和触发器操作)会被回滚。A、B 错误:原插入数据会被撤销;D 错误:数据库不会自动重试触发器。 10.数据表:供应商表 supplier (供应商 id s_id, 供应商名 s_name, 地址 address) 下列关于触发器使用规则的说法,错误的是( ) A. 触发器不能嵌套使用 B. 触发器可以与临时表或视图关联 C. 触发器只能针对永久性表创建 D. 过度使用触发器会降低数据库访问速度 【答案】B 【解析】触发器使用规则:① 不能嵌套使用;② 只能与永久性表关联,不能与临时表或视图关联;③ 执行效率较低,过度使用会降低性能、增加维护难度。B 选项说法错误,符合题意。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。 本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第65练,内容是触发器概述和创建触发器。 《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第65练 触发器概述和创建触发器 一、单项选择题 1. 数据表:学生表 student (学号 s_id, 姓名 s_name, 年龄 s_age) 下列创建触发器的 SQL 语句,语法顺序完全正确的是( ) A. CREATE TRIGGER tri_stu_insert ON student BEFORE INSERT FOR EACH ROW SET @count=@count+1; B. CREATE TRIGGER tri_stu_insert BEFORE INSERT ON student FOR EACH ROW SET @count=@count+1; C. CREATE TRIGGER tri_stu_insert INSERT BEFORE ON student FOR EACH ROW SET @count=@count+1; D. CREATE TRIGGER BEFORE INSERT tri_stu_insert ON student FOR EACH ROW SET @count=@count+1; 2.数据表:成绩表 score (学号 s_id, 科目 sub, 分数 mark) 下列触发器创建语句中,存在核心语法错误的是( ) A. CREATE TRIGGER tri_score_update AFTER UPDATE ON score FOR EACH ROW SET @update_time=NOW(); B. CREATE TRIGGER tri_score_delete AFTER DELETE ON score FOR EACH ROW DELETE FROM log WHERE s_id=OLD.s_id; C. CREATE TRIGGER tri_score_insert BEFORE INSERT ON score SET @insert_count=@insert_count+1; D. CREATE TRIGGER tri_score_check BEFORE INSERT ON score FOR EACH ROW IF NEW.mark<0 THEN SET NEW.mark=0; END IF; 3.数据表:订单表 order (订单号 o_id, 用户 id u_id, 金额 amount, 下单时间 o_time) 关于触发事件的写法,下列语法正确的是( ) A. CREATE TRIGGER tri_order_insert BEFORE INSERT INTO ON order FOR EACH ROW ...; B. CREATE TRIGGER tri_order_change BEFORE INSERT,UPDATE ON order FOR EACH ROW ...; C. CREATE TRIGGER tri_order_delete AFTER DELETE ON order FOR EACH ROW ...; D. CREATE TRIGGER tri_order_modify AFTER MODIFY ON order FOR EACH ROW ...; 4.数据表:商品表 goods (商品 id g_id, 商品名 g_name, 库存 stock, 价格 price) 触发器主体包含多条 SQL 语句时,下列写法正确的是( ) A. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); B. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW BEGIN UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); END; C. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW ( UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW()); ); D. CREATE TRIGGER tri_goods_update AFTER UPDATE ON goods FOR EACH ROW {UPDATE stock_log SET change_num=NEW.stock-OLD.stock WHERE g_id=NEW.g_id; INSERT INTO operate_log VALUES(NEW.g_id,'更新库存',NOW());}; 5.数据表:用户表 user (用户 id u_id, 用户名 u_name, 积分 points) 下列触发器语句中,违反触发器使用原则的是( ) A. CREATE TRIGGER tri_user_insert AFTER INSERT ON user FOR EACH ROW INSERT INTO user_log VALUES(NEW.u_id,'注册',NOW()); B. CREATE TRIGGER tri_user_update BEFORE UPDATE ON user FOR EACH ROW IF NEW.points<0 THEN SET NEW.points=0; END IF; C. CREATE TRIGGER tri_user_delete AFTER DELETE ON user FOR EACH ROW DELETE FROM order WHERE u_id=OLD.u_id; D. CREATE TRIGGER tri_user_points AFTER UPDATE ON user FOR EACH ROW UPDATE user SET points=points+10 WHERE u_id=NEW.u_id; 6.数据表:班级表 class (班级 id c_id, 班级名 c_name, 人数 num) 关于触发器数量限制,下列说法正确的是( ) A. 可以在 class 表上创建 2 个 BEFORE INSERT 触发器 B. class 表最多支持 3 种触发器 C. 每个表的每个事件每次只允许有一个触发器 D. 可以创建一个同时关联 class 表和 student 表的触发器 7.数据表:图书表 book (图书 id b_id, 书名 b_name, 价格 price, 库存 stock) 需要在插入图书数据前验证价格是否大于 0,下列触发器写法正确的是( ) A. CREATE TRIGGER tri_book_check AFTER INSERT ON book FOR EACH ROW IF NEW.price<=0 THEN SET NEW.price=10; END IF; B. CREATE TRIGGER tri_book_check BEFORE INSERT ON book FOR EACH ROW IF NEW.price<=0 THEN SET NEW.price=10; END IF; C. CREATE TRIGGER tri_book_check BEFORE INSERT ON book FOR EACH ROW IF OLD.price<=0 THEN SET OLD.price=10; END IF; D. CREATE TRIGGER tri_book_check AFTER INSERT ON book FOR EACH ROW IF OLD.price<=0 THEN SET OLD.price=10; END IF; 8.数据表:员工表 emp (员工 id e_id, 姓名 e_name, 部门 dept, 工资 salary) 下列关于触发器执行方式的 SQL 语句,正确的是( ) A. CALL tri_emp_insert; B. EXEC tri_emp_update; C. INSERT INTO emp(e_name,dept) VALUES('张三','技术部'); D. SELECT * FROM emp WHERE dept='技术部'; 9.数据表:日志表 log (日志 id l_id, 操作类型 op_type, 操作时间 op_time) 若向 log 表插入数据时触发器执行失败,下列说法正确的是( ) A. 插入的数据仍然会保留在 log 表中 B. 触发器执行失败不影响原操作的结果 C. 原插入操作的结果会被完全撤销 D. 数据库会自动重试执行触发器 3 次 10.数据表:供应商表 supplier (供应商 id s_id, 供应商名 s_name, 地址 address) 下列关于触发器使用规则的说法,错误的是( ) A. 触发器不能嵌套使用 B. 触发器可以与临时表或视图关联 C. 触发器只能针对永久性表创建 D. 过度使用触发器会降低数据库访问速度 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第65练 项目九 触发器概述和创建触发器《数据库原理与应用技术-MySQL》(河北科学技术出版社)一课一练(河北省)
1
第65练 项目九 触发器概述和创建触发器《数据库原理与应用技术-MySQL》(河北科学技术出版社)一课一练(河北省)
2
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。