内容正文:
编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《数据库原理与应用技术-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. 过度使用触发器会降低数据库访问速度
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$