MySQL周内训参照4、触发器-插入-修改-删除

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL周内训参照4、触发器-插入-修改-删除
编号 人员 题目 总分数 题干 提交内容 得分标准
7 程序员 触发器 15 trigger要求:
1、用户表添加语句添加触发器,要求在添加用户信息时同时初始化用户钱包表数据,初始金额为0。
2、商品表修改语句添加触发器,要求在修改商品售价时不允许上下浮动超过10%。
3、订单表删除语句添加触发器,要求在删除订单信息时先删除订单详情表中的订单信息。
提交3条sql与对应的结果截图 1、要求给出触发器完整函数语句(3分/问,共9分)
2、触发器中有明确的注释(3分)
3、给出触发器测试语句(3分)
8 程序员 存储过程 20 percedure基本要求:
1、添加一个用户下订单的存储过程,存储过程名称叫做【create_order_infos()】
2、要求传入创建订单所必须的参数内容,例如:用户编号、商品编号、购买数量等信息。
3、需要根据传入的信息插入【用户钱包交易日志表】、【订单表】、【订单详情表】信息,修改【用户钱包表】、【商品表】。
提交完整的存储过程语句与测试语句。 1、函数名称匹配(1分)
2、正确传入参数(3分)
3、写明存储过程的详细注释(5分)
4、正确添加所有日志信息(6分)
5、正确添加订单与订单详情(6分)
6、正确修改用户钱包表与商品表数值(6分)
7、给出存储过程测试语句(3分)

触发器

1、用户表添加语句添加触发器,要求在添加用户信息时同时初始化用户钱包表数据,初始金额为0。

-- 触发器:在user表插入新记录后,自动为新用户创建wallet记录
DELIMITER //
CREATE TRIGGER after_user_insert
AFTER INSERT ON user
FOR EACH ROW
BEGIN
    -- 向user_wallet表中插入新记录,user_id使用新插入的用户的ID,balance初始化为0.00
    INSERT INTO user_wallet (user_id, balance)
    VALUES (NEW.user_id, 0.00);
END;
//
DELIMITER ;

测试语句

-- 插入新用户记录,触发器应自动在user_wallet表中创建对应wallet记录
INSERT INTO user (username, password, email, phone)
VALUES ('newuser', 'password123', 'newuser@example.com', '1234567890');
 
 
-- 查询user_wallet表确认新wallet记录是否存在
SELECT * FROM user_wallet WHERE user_id = (SELECT user_id FROM user WHERE username = 'newuser');

2、商品表修改语句添加触发器,要求在修改商品售价时不允许上下浮动超过10%。

DELIMITER //
CREATE TRIGGER trg_check_price_change
BEFORE UPDATE ON product
FOR EACH ROW
BEGIN
    -- 声明变量来存储旧价格和新价格
    DECLARE old_price DECIMAL(10, 2);
    DECLARE new_price DECIMAL(10, 2);
    
    -- 声明变量来存储价格变动的百分比
    DECLARE percentage_change DECIMAL(10, 2);
    
    -- 获取旧价格和新价格
    SET old_price = OLD.price;
    SET new_price = NEW.price;
    
    -- 检查新价格是否为0,以避免除以0的错误
    IF new_price = 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '新价格不能为0。';
    END IF;
    
    -- 计算价格变动的百分比
    SET percentage_change = (new_price - old_price) / old_price * 100;
    
    -- 检查价格变动是否超过10%
    IF ABS(percentage_change) > 10 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '商品售价上下浮动不能超过10%。';
    END IF;
END;
//
DELIMITER ;

测试语句

--插入测试数据:
INSERT INTO product (product_name, price, stock, type_id) VALUES ('Test Product', 100.00, 10, 1);
--正常更新(未超过10%):
UPDATE product SET price = 110.00 WHERE product_name = 'Test Product'; -- 应成功
更新超过10%(触发错误):
UPDATE product SET price = 550.00 WHERE product_name = 'Test Product'; -- 应触发错误

手动修改直接会触发。

3、订单表删除语句添加触发器,要求在删除订单信息时先删除订单详情表中的订单信息。

DELIMITER //
CREATE TRIGGER trg_delete_order_details
BEFORE DELETE ON `order`
FOR EACH ROW
BEGIN
    -- 删除与即将被删除的订单相关联的所有订单详情记录
    DELETE FROM order_info WHERE order_id = OLD.order_id;
END;
//
DELIMITER ;

测试语句

插入测试数据到order和order_info表,用做测试。

INSERT INTO `order` (`user_id`, `order_status`, `total_price`) VALUES (1, '待支付', 100.00);
INSERT INTO order_info (order_id, product_id, quantity, unit_price) VALUES (LAST_INSERT_ID(), 1, 2, 50.00);

执行删除操作,并观察order_info表的变化。

DELETE FROM `order` WHERE `order_id` = 刚才添加的id号;

检查order_info表,确保与刚才删除的订单相关的记录已被删除。

SELECT * FROM order_info WHERE order_id = 刚才添加的id号;

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
1月前
|
存储 关系型数据库 MySQL
MySQL周内训参照5、存储过程创建
MySQL周内训参照5、存储过程创建
31 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL周内训参照3、简单查询与多表联合复杂查询
MySQL周内训参照3、简单查询与多表联合复杂查询
24 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL周内训参照2、DDL与DML语句
MySQL周内训参照2、DDL与DML语句
17 1
|
1月前
|
存储 关系型数据库 MySQL
MySQL周内训参照1、ER实体关系图与数据库模型图绘制
MySQL周内训参照1、ER实体关系图与数据库模型图绘制
32 1
|
1月前
|
存储 SQL 关系型数据库
MySQL存储过程_触发器_游标——Baidu Comate
MySQL存储过程_触发器_游标——Baidu Comate
20 0
|
1月前
|
SQL 存储 关系型数据库
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
16 0
|
13天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
10天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
983 6
Mysql 数据库主从复制
|
11天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。