MySQL实训

news2024/11/24 11:50:22

项目名称与项目简介

股票交易系统是一个综合性的金融服务平台,它提供了股票买卖、交易查询、用户管理、股票信息管理以及资金账户管理等功能。系统旨在为用户提供一个安全、高效、便捷的股票交易环境,让用户能够实时掌握市场动态,做出合理的投资决策。

该系统的主要功能包括:

1、用户管理:注册新用户、修改用户信息、密码重置等。

2、股票信息管理:添加、修改和删除股票信息,包括股票代码、名称、价格等。

3、股票交易:用户可以进行股票的买入和卖出操作,系统记录交易详情。

4、交易查询:用户可以查询自己的交易记录,包括买入、卖出以及持仓情况。

5、资金账户管理:管理用户的资金账户,包括充值、提现、查看账户余额等。

 DDL

 
-- 创建用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '密码',
    first_name VARCHAR(50) NOT NULL COMMENT '名',
    last_name VARCHAR(50) NOT NULL COMMENT '姓',
    email VARCHAR(100) COMMENT '邮箱地址',
    phone VARCHAR(20) COMMENT '电话号码',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '账户余额'
);
 
 
-- 创建股票信息表
CREATE TABLE stocks (
    stock_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '股票ID',
    stock_code VARCHAR(10) NOT NULL COMMENT '股票代码',
    stock_name VARCHAR(100) NOT NULL COMMENT '股票名称',
    current_price DECIMAL(10, 2) NOT NULL COMMENT '当前价格',
    open_price DECIMAL(10, 2) COMMENT '开盘价',
    close_price DECIMAL(10, 2) COMMENT '收盘价',
    change_rate DECIMAL(5, 2) COMMENT '涨跌幅'
);
 
 
-- 创建交易记录表
CREATE TABLE transactions (
    transaction_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '交易ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    transaction_type ENUM('BUY', 'SELL') NOT NULL COMMENT '交易类型(买/卖)',
    price_per_share DECIMAL(10, 2) NOT NULL COMMENT '每股价格',
    quantity INT NOT NULL COMMENT '交易数量',
    transaction_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '交易时间',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建交易订单表(可选,用于保存未成交的订单)
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    order_type ENUM('BUY', 'SELL') NOT NULL COMMENT '订单类型(买/卖)',
    price_per_share DECIMAL(10, 2) NOT NULL COMMENT '每股价格',
    quantity INT NOT NULL COMMENT '订单数量',
    order_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单时间',
    status ENUM('PENDING', 'FILLED', 'CANCELLED') NOT NULL DEFAULT 'PENDING' COMMENT '订单状态',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建股票持仓表(可选,用于记录用户当前的股票持仓情况)
CREATE TABLE portfolios (
    portfolio_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '持仓ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    quantity INT NOT NULL COMMENT '持仓数量',
    average_cost_per_share DECIMAL(10, 2) NOT NULL COMMENT '平均每股成本',
    current_value DECIMAL(10, 2) NOT NULL COMMENT '当前总价值',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建资金流水表(可选,用于记录用户的资金变动情况)
CREATE TABLE fund_flows (
    flow_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '流水ID',
    user_id INT NOT NULL COMMENT '用户ID',
    transaction_id INT COMMENT '交易ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '金额',
    flow_type ENUM('DEPOSIT', 'WITHDRAWAL', 'TRADE') NOT NULL COMMENT '流水类型(充值/提现/交易)',
    flow_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '流水时间',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (transaction_id) REFERENCES transactions(transaction_id)
);

 DML

-- 插入用户数据
INSERT INTO users (username, password, first_name, last_name, email, phone, gender, balance) VALUES
('刘备', '123', '刘', '备', 'liubei@example.com', '13800138000', '男', 10000.00),
('曹操', '123', '曹', '操', 'caocao@example.com', '13900139000', '男', 20000.00),
('孙权', '123', '孙', '权', 'sunquan@example.com', '13700137000', '男', 15000.00);
 
 
-- 插入股票数据
INSERT INTO stocks (stock_code, stock_name, current_price, open_price, close_price, change_rate) VALUES
('000001', '蜀汉股份', 10.50, 10.20, 10.40, 2.94),
('000002', '曹魏集团', 15.80, 15.50, 15.70, 1.94),
('000003', '东吴证券', 8.90, 8.70, 8.85, 2.30);
 
 
-- 插入交易记录数据(假设刘备买了蜀汉股份,曹操卖了曹魏集团,孙权买了东吴证券)
 
-- 假设刘备的user_id是1,蜀汉股份的stock_id是1
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(1, 1, 'BUY', 10.45, 100, NOW()); -- 刘备购买蜀汉股份
 
 
-- 假设曹操的user_id是2,曹魏集团的stock_id是2
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(2, 2, 'SELL', 15.37, 50, NOW()); -- 曹操卖出曹魏集团
 
 
-- 假设孙权的user_id是3,东吴证券的stock_id是3
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(3, 3, 'BUY', 8.88, 200, NOW()); -- 孙权购买东吴证券
 
 
-- 插入交易订单数据(可选,这里作为示例插入)
INSERT INTO orders (user_id, stock_id, order_type, price_per_share, quantity, order_date, status) VALUES
(1, 2, 'BUY', 15.60, 30, NOW(), 'PENDING'),  -- 刘备打算购买曹魏集团
(3, 1, 'SELL', 10.60, 50, NOW(), 'PENDING');  -- 孙权打算卖出蜀汉股份
 
 
-- 插入股票持仓数据(可选,这里根据交易记录数据插入)
INSERT INTO portfolios (user_id, stock_id, quantity, average_cost_per_share, current_value) VALUES
(1, 1, 100, 10.45, 1045.00),  -- 刘备持仓蜀汉股份
(2, 2, 50, 15.75, 787.50),    -- 曹操剩余持仓曹魏集团(假设他原本有更多)
(3, 3, 200, 8.88, 1776.00);   -- 孙权持仓东吴证券
 
 
-- 插入资金流水数据(可选,这里根据交易记录数据插入)
INSERT INTO fund_flows (user_id, transaction_id, amount, flow_type, flow_date) VALUES
(1, 1, 1045.00, 'TRADE', NOW()),  -- 刘备购买蜀汉股份的资金流出
(2, 2, -787.50, 'TRADE', NOW()),  -- 曹操卖出曹魏集团的资金流入(负数表示资金流入)
(3, 3, 1776.00, 'TRADE', NOW());  -- 孙权购买东吴证券的资金流出

1、 绘制ER图

 

 2、数据库模型图

 

 3、设计表格

 
-- 创建用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '密码',
    first_name VARCHAR(50) NOT NULL COMMENT '名',
    last_name VARCHAR(50) NOT NULL COMMENT '姓',
    email VARCHAR(100) COMMENT '邮箱地址',
    phone VARCHAR(20) COMMENT '电话号码',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '账户余额'
);
 
 
-- 创建股票信息表
CREATE TABLE stocks (
    stock_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '股票ID',
    stock_code VARCHAR(10) NOT NULL COMMENT '股票代码',
    stock_name VARCHAR(100) NOT NULL COMMENT '股票名称',
    current_price DECIMAL(10, 2) NOT NULL COMMENT '当前价格',
    open_price DECIMAL(10, 2) COMMENT '开盘价',
    close_price DECIMAL(10, 2) COMMENT '收盘价',
    change_rate DECIMAL(5, 2) COMMENT '涨跌幅'
);
 
 
-- 创建交易记录表
CREATE TABLE transactions (
    transaction_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '交易ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    transaction_type ENUM('BUY', 'SELL') NOT NULL COMMENT '交易类型(买/卖)',
    price_per_share DECIMAL(10, 2) NOT NULL COMMENT '每股价格',
    quantity INT NOT NULL COMMENT '交易数量',
    transaction_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '交易时间',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建交易订单表(可选,用于保存未成交的订单)
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    order_type ENUM('BUY', 'SELL') NOT NULL COMMENT '订单类型(买/卖)',
    price_per_share DECIMAL(10, 2) NOT NULL COMMENT '每股价格',
    quantity INT NOT NULL COMMENT '订单数量',
    order_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单时间',
    status ENUM('PENDING', 'FILLED', 'CANCELLED') NOT NULL DEFAULT 'PENDING' COMMENT '订单状态',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建股票持仓表(可选,用于记录用户当前的股票持仓情况)
CREATE TABLE portfolios (
    portfolio_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '持仓ID',
    user_id INT NOT NULL COMMENT '用户ID',
    stock_id INT NOT NULL COMMENT '股票ID',
    quantity INT NOT NULL COMMENT '持仓数量',
    average_cost_per_share DECIMAL(10, 2) NOT NULL COMMENT '平均每股成本',
    current_value DECIMAL(10, 2) NOT NULL COMMENT '当前总价值',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (stock_id) REFERENCES stocks(stock_id)
);
 
 
-- 创建资金流水表(可选,用于记录用户的资金变动情况)
CREATE TABLE fund_flows (
    flow_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '流水ID',
    user_id INT NOT NULL COMMENT '用户ID',
    transaction_id INT COMMENT '交易ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '金额',
    flow_type ENUM('DEPOSIT', 'WITHDRAWAL', 'TRADE') NOT NULL COMMENT '流水类型(充值/提现/交易)',
    flow_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '流水时间',
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (transaction_id) REFERENCES transactions(transaction_id)
);

 4、插入记录(DML)

【无标题】-CSDN博客 

​-- 插入用户数据
INSERT INTO users (username, password, first_name, last_name, email, phone, gender, balance) VALUES
('刘备', '123', '刘', '备', 'liubei@example.com', '13800138000', '男', 10000.00),
('曹操', '123', '曹', '操', 'caocao@example.com', '13900139000', '男', 20000.00),
('孙权', '123', '孙', '权', 'sunquan@example.com', '13700137000', '男', 15000.00),
('马超', '123', '马', '超', 'machao@example.com', '13700137001', '男', 16000.00),
('张飞', '123', '张', '飞', 'zhangfei@example.com', '13700137002', '男', 17000.00),
('貂蝉', '123', '貂', '蝉', 'diaochan@example.com', '13700137003', '女', 18000.00),
('关羽', '123', '关', '羽', 'guanyu@example.com', '13700137004', '男', 14000.00),
('赵云', '123', '赵', '云', 'zhaoyun@example.com', '13700137005', '男', 13000.00);
 
 
-- 插入股票数据
INSERT INTO stocks (stock_code, stock_name, current_price, open_price, close_price, change_rate) VALUES
('000001', '蜀汉股份', 10.50, 10.20, 10.40, 2.94),
('000002', '曹魏集团', 15.80, 15.50, 15.70, 1.94),
('000003', '东吴证券', 8.90, 8.70, 8.85, 2.30),
('000004', '百年马家', 7.90, 8.80, 8.88, 1.30),
('000005', '怒吼集团', 4.90, 7.70, 5.85, 3.30),
('000006', '无忧传媒', 5.90, 10.70, 9.55, 2.30),
('000007', '兄弟情义', 8.50, 7.00, 10.00, 3.30),
('000008', '忠义公司', 8.90, 10.70, 6.85, 2.30);
 
 
-- 插入交易记录数据(假设刘备买了蜀汉股份,曹操卖了曹魏集团,孙权买了东吴证券)
 
-- 假设刘备的user_id是1,蜀汉股份的stock_id是1
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(1, 1, 'BUY', 10.45, 100, NOW()); -- 刘备购买蜀汉股份
 
 
-- 假设曹操的user_id是2,曹魏集团的stock_id是2
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(2, 2, 'SELL', 15.37, 50, NOW()); -- 曹操卖出曹魏集团
 
 
-- 假设孙权的user_id是3,东吴证券的stock_id是3
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(3, 3, 'BUY', 8.88, 200, NOW()); -- 孙权购买东吴证券
 
 -- 假设马超的user_id是4,百年马家的stock_id是4
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(4, 4, 'BUY',6.66, 50, NOW()); -- 马超购买百年马家
 
 -- 假设张飞的user_id是5,怒吼集团的stock_id是5
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(5, 5, 'SELL',6.66, 50, NOW()); -- 张飞卖出怒吼集团
 
 -- 假设貂蝉的user_id是6,无忧传媒的stock_id是6
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(6, 6, 'BUY',3.00, 50, NOW()); -- 貂蝉购买无忧传媒
 
  -- 假设关羽的user_id是7,兄弟情义的stock_id是7
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(7, 7, 'BUY',4.20, 100, NOW()); -- 关羽购买兄弟情义
 
 -- 假设赵云的user_id是8,忠义公司的stock_id是8
INSERT INTO transactions (user_id, stock_id, transaction_type, price_per_share, quantity, transaction_date) VALUES
(8, 8, 'BUY',5.00, 100, NOW()); -- 赵云购买忠义公司
 
 
-- 插入交易订单数据(可选,这里作为示例插入)
INSERT INTO orders (user_id, stock_id, order_type, price_per_share, quantity, order_date, status) VALUES
(1, 2, 'BUY', 15.60, 30, NOW(), 'PENDING'),  -- 刘备打算购买曹魏集团
(3, 1, 'SELL', 10.60, 50, NOW(), 'PENDING'),  -- 孙权打算卖出蜀汉股份
(4, 3, 'BUY', 8.60, 50, NOW(), 'PENDING'),  -- 马超打算购买东吴证券
(5, 6, 'BUY', 10.00, 50, NOW(), 'PENDING'),  -- 张飞打算购买无忧集团
(6, 7, 'SELL', 11.60, 20, NOW(), 'PENDING'),  -- 貂蝉打算卖出兄弟情义
(8, 5, 'BUY', 9.60, 50, NOW(), 'PENDING'),  -- 赵云打算购买怒吼集团
(7, 4, 'SELL', 8.00, 100, NOW(), 'PENDING');  -- 关羽打算卖出百年马家
 
 
-- 插入股票持仓数据(可选,这里根据交易记录数据插入)
INSERT INTO portfolios (user_id, stock_id, quantity, average_cost_per_share, current_value) VALUES
(1, 1, 100, 10.45, 1045.00),  -- 刘备持仓蜀汉股份
(2, 2, 50, 15.75, 787.50),    -- 曹操剩余持仓曹魏集团(假设他原本有更多)
(3, 3, 200, 8.88, 1776.00),   -- 孙权持仓东吴证券
(4, 4, 100, 10.45, 1000.00),  -- 马超持仓百年马家
(5, 5, 150, 10.50, 1365.00),  -- 张飞持仓怒吼集团
(6, 6, 110, 8.45, 1205.00),  -- 貂蝉持仓无忧传媒
(7, 7, 80, 6.45, 1180.00),  -- 关羽持仓兄弟情义
(8, 8, 160, 11.45, 900.00);  -- 赵云持仓忠义公司
 
 
-- 插入资金流水数据(可选,这里根据交易记录数据插入)
INSERT INTO fund_flows (user_id, transaction_id, amount, flow_type, flow_date) VALUES
(1, 1, 1045.00, 'TRADE', NOW()),  -- 刘备购买蜀汉股份的资金流出
(2, 2, -787.50, 'TRADE', NOW()),  -- 曹操卖出曹魏集团的资金流入(负数表示资金流入)
(3, 3, 1776.00, 'TRADE', NOW()),  -- 孙权购买东吴证券的资金流出
(4, 4, -1000.00, 'TRADE', NOW()),  -- 马超购买百年马家的资金流入
(5, 5, 1365.00, 'TRADE', NOW()),  -- 张飞购买怒吼集团的资金流出
(6, 6, -1205.00, 'TRADE', NOW()),  -- 貂蝉购买无忧传媒的资金流入
(7, 7, 1180.00, 'TRADE', NOW()),  -- 关羽购买兄弟情义的资金流出
(8, 8, -900.00, 'TRADE', NOW());  -- 赵云购买忠义公司的资金流入
 
​

5、基础查询

-- 1、查询用户信息仅显示姓名与手机号
SELECT username as '姓名',phone as '手机号' from users;
 
-- 2、模糊查询和explain语句
alter table stocks add index stock_name_index(stock_name);
explain SELECT * from stocks where stock_name like '%东吴证券%'; 
 
-- 3、统计用户订单信息,查询所有用户的下单数量,并进行倒序排列。
SELECT user_id, COUNT(order_id) as '订单数量' from orders group by  user_id order by count(order_id) desc;

 

6、复杂查询

-- 1. 查询用户的基本信息
SELECT * FROM users;
 
-- 2. 查看订单中下单最多的股票产品对应的类别
SELECT stock_name, COUNT(*) AS order_count
FROM orders o
JOIN stocks s ON o.stock_id = s.stock_id
GROUP BY stock_name
ORDER BY order_count DESC
LIMIT 1;
 
-- 3. 查询下单股票数量最多的用户,并查询用户的全部信息与当前股票剩余库存
SELECT u.*, p.quantity AS remaining_stock_quantity
FROM users u
JOIN (
    SELECT user_id, SUM(quantity) AS total_quantity
    FROM transactions
    GROUP BY user_id
    ORDER BY total_quantity DESC
    LIMIT 1
) t ON u.user_id = t.user_id
JOIN portfolios p ON u.user_id = p.user_id;

7、管理用户的资金账户,包括充值、提现、查看账户余额等。 (触发器)

DELIMITER //
-- 创建名为 `process_fund_operation` 的存储过程
CREATE PROCEDURE `process_fund_operation`(
    -- 输入参数:用户 ID
    IN p_user_id INT, 
    -- 输入参数:操作金额
    IN p_amount DECIMAL(10, 2), 
    -- 输入参数:操作类型为 'DEPOSIT'(充值)或 'WITHDRAWAL'(提现)
    IN p_operation_type ENUM('DEPOSIT', 'WITHDRAWAL'), 
    -- 输出参数:操作结果消息
    OUT p_result_message VARCHAR(255)
)
BEGIN
    -- 声明变量用于存储用户原有的余额
    DECLARE old_balance DECIMAL(10, 2);
    -- 声明变量用于存储用户操作后的新余额
    DECLARE new_balance DECIMAL(10, 2);

    -- 从 `users` 表中获取指定用户的原有余额
    SELECT balance INTO old_balance FROM users WHERE user_id = p_user_id;

    -- 如果没有找到该用户
    IF old_balance IS NULL THEN
        -- 设置输出的结果消息为'用户不存在'
        SET p_result_message = '用户不存在';
    ELSE
        -- 如果操作类型是'充值'
        IF p_operation_type = 'DEPOSIT' THEN
            -- 计算新的余额,即原余额加上充值金额
            SET new_balance = old_balance + p_amount;
            -- 更新用户的余额
            UPDATE users SET balance = new_balance WHERE user_id = p_user_id;
            -- 向 `fund_flows` 表中插入充值记录(添加日志信息)
            INSERT INTO fund_flows (user_id, amount, flow_type) VALUES (p_user_id, p_amount, 'DEPOSIT');
            -- 设置输出的结果消息,包含原余额和新余额
            SET p_result_message = CONCAT('充值成功,原余额:', old_balance, ',新余额:', new_balance);
        -- 如果操作类型是'提现'
        ELSEIF p_operation_type = 'WITHDRAWAL' THEN
            -- 如果原余额小于提现金额
            IF old_balance < p_amount THEN
                -- 设置输出的结果消息为'余额不足,提现失败'
                SET p_result_message = '余额不足,提现失败';
            ELSE
                -- 计算新的余额,即原余额减去提现金额
                SET new_balance = old_balance - p_amount;
                -- 更新用户的余额
                UPDATE users SET balance = new_balance WHERE user_id = p_user_id;
                -- 向 `fund_flows` 表中插入提现记录,金额为负数
                INSERT INTO fund_flows (user_id, amount, flow_type) VALUES (p_user_id, -p_amount, 'WITHDRAWAL');
                -- 设置输出的结果消息,包含原余额和新余额
                SET p_result_message = CONCAT('提现成功,原余额:', old_balance, ',新余额:', new_balance);
            END IF;
        END IF;
    END IF;
END//



-- 充值测试语句
CALL process_fund_operation(1, 5000.00, 'DEPOSIT', @result_message);
SELECT @result_message;

-- 提现测试语句
CALL process_fund_operation(1, 2000.00, 'WITHDRAWAL', @result_message);
SELECT @result_message;

 在fund_flow表中的记录(日志表)

8、股票信息管理:添加、修改和删除股票信息,包括股票代码、名称、价格等 (存储过程)

DELIMITER //

-- 创建在插入股票信息前的触发器
CREATE TRIGGER `before_insert_stocks` BEFORE INSERT ON `stocks`
FOR EACH ROW
BEGIN
    -- 检查插入的新股票记录中,股票代码、名称和当前价格是否都有效
    IF NEW.stock_code IS NULL OR NEW.stock_name IS NULL OR NEW.current_price <= 0 THEN
        -- 如果有任何一个无效,触发错误并停止插入操作
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入股票时,股票代码、名称不能为空,当前价格必须大于 0';
    END IF;
END//

-- 创建在更新股票信息前的触发器
CREATE TRIGGER `before_update_stocks` BEFORE UPDATE ON `stocks`
FOR EACH ROW
BEGIN
    -- 检查更新操作中,如果股票代码、名称或当前价格被修改,且新值无效
    IF ((OLD.stock_code <> NEW.stock_code AND NEW.stock_code IS NULL) 
        OR (OLD.stock_name <> NEW.stock_name AND NEW.stock_name IS NULL) 
        OR (OLD.current_price <> NEW.current_price AND NEW.current_price <= 0)) THEN
        -- 如果有任何一个无效,触发错误并停止更新操作
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '更新股票时,修改的股票代码、名称不能为空,修改的当前价格必须大于 0';
    END IF;
END//

-- 创建在删除股票信息前的触发器
CREATE TRIGGER `before_delete_stocks` BEFORE DELETE ON `stocks`
FOR EACH ROW
BEGIN
    -- 禁止删除股票信息,触发错误并停止删除操作
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '当前不允许删除股票信息';
END//

DELIMITER ;

测试语句

-- 股票代码为空,应触发错误
INSERT INTO stocks (stock_code, stock_name, current_price) VALUES (NULL, '测试股票', 10.00);
-- 股票名称为空,应触发错误
INSERT INTO stocks (stock_code, stock_name, current_price) VALUES ('000004', NULL, 10.00);
-- 当前价格小于等于 0,应触发错误
INSERT INTO stocks (stock_code, stock_name, current_price) VALUES ('000005', '测试股票', 0);
-- 有效插入,应成功
INSERT INTO stocks (stock_code, stock_name, current_price) VALUES ('000006', '测试股票', 15.00);

-- 更新股票代码为空,应触发错误
UPDATE stocks SET stock_code = NULL WHERE stock_id = 1;
-- 更新股票名称为空,应触发错误
UPDATE stocks SET stock_name = NULL WHERE stock_id = 1;
-- 更新当前价格小于等于 0,应触发错误
UPDATE stocks SET current_price = 0 WHERE stock_id = 1;
-- 有效更新,应成功
UPDATE stocks SET current_price = 20.00 WHERE stock_id = 1;


-- 删除股票信息,应触发错误
DELETE FROM stocks WHERE stock_id = 1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang项目基于gorm框架从postgre数据库迁移到达梦数据库的实践

一、安装达梦数据库 1、登录达梦数据库官网&#xff0c;下载对应系统版本的安装包。 2、下载地址为&#xff1a;https://www.dameng.com/list_103.html 3、达梦数据库对大小写敏感&#xff0c;在安装初始化数据库实例时建议忽略大小写&#xff1b;具体安装教程可参考以下博客: …

知不知行不行?

老树新芽&#xff0c; 结合最近几个观点&#xff0c;再拓展&#xff1a; Prompt & “Prompt—生成—选择” 事前提要求&#xff0c;事后决定满意不满意&#xff0c;中间尽量少干涉——老板对员工不也是这样吗&#xff1f;甲方对乙方不也是这样吗&#xff1f;都是后者在生…

VMware虚拟机移植保姆级教程

文章目录 前言:一、打包与备份二、VMware移植1. 文件介绍2. 移植过程总结:前言: 前几日对电脑做了一个大的更新升级,不仅将硬件进行了升级,还对电脑的软件进行了升级也就是我从Win10今家庭版升级到Win11专业版啦,之前没有升级是因为数据量很多,怕升级后找不到自己需要的…

vue-cli搭建过程

1.vue-cli 概述 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff0c;预先定义好的目录结构及基础代码 举个例子吧&#xff01; 比如之前学过的Maven,在创建 Maven 项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架&#x…

goLang小案例-打印99乘法表

goLang小案例-打印99乘法表 1. 打印99乘法表 func Print99multiplication1() {//横向9排for i : 1; i < 9; i {//竖向9列//第一批第一个 和第一列比较 如果大于排就结束//假设第三排i3 最走有三列 1*3 2*3 3*3//j3打印完 j 当j4就要结束 以此类推for j : 1; j < i; j …

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料&#xff0c;一包汤底料竟然就能撑起一家店的灵魂&#xff01;&#x1f372; 简单的食材&#xff0c;却散发出不平凡的美味&#xff0c;仿佛带我穿越千里之外。每一口都是满满的幸福与满足&#xff0c;真心推荐…

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)​编辑转到底部 In this Document Purpose Troubleshooting Steps References APPLIES TO: Oracle Database - Enterprise Edition Oracle Database Cloud Schema Service - Version N/A and lat…

Stateflow快速入门系列(五): 通过广播事件同步并行状态

局部事件允许一个状态触发同一个 Stateflow图中另一个状态的转移或动作&#xff0c;从而使您能够协调并行状态。要将事件从一个状态广播到另一个状态&#xff0c;请使用 send 运算符以及事件的名称和激活状态的名称&#xff1a; send(eventName,stateName) 当您广播事件时&am…

2024年【建筑电工(建筑特殊工种)】模拟试题及建筑电工(建筑特殊工种)作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年建筑电工(建筑特殊工种)模拟试题为正在备考建筑电工(建筑特殊工种)操作证的学员准备的理论考试专题&#xff0c;每个月更新的建筑电工(建筑特殊工种)作业考试题库祝您顺利通过建筑电工(建筑特殊工种)考试。 1、…

FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo

在运行 FastGPT 时&#xff0c;mongodb 报如下错误&#xff1a; MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来&#xff0c;在 hosts 文件中添加如下信息&#xff1a; 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接&#xff…

庆祝东兴市金顺心贸易有限公司代理越南三原竹系列产品五周年

&#x1f389;庆祝金顺心贸易代理越南三原竹系列产品五周年&#xff01;这五年&#xff0c;我们共同成长&#xff0c;每一份产品都承载着越南的美味与匠心。感恩有你们&#xff0c;未来的路&#xff0c;我们继续携手前行&#xff0c;品味更多美好&#xff01;&#x1f962;&…

“骑友应小心“杀猪盘”,骑行圈也是小社会”

在数字时代&#xff0c;自媒体平台上的信息传播迅速而广泛&#xff0c;人们的社交活动也愈加多元化。骑行圈&#xff0c;作为一个集体育、休闲与社交于一体的圈子&#xff0c;其独特的魅力吸引着无数热爱生活、享受自然的人们。然而&#xff0c;在享受共同的爱好与乐趣之时&…

Dom4j的基本使用 , XML解析方式和解析器 ,Dom4J结合XPath解析XML

第二章 Dom4j 1 XML解析 1.1 解析概述 ​ 当将数据存储在XML后&#xff0c;我们就希望通过程序获取XML的内容。我们使用Java基础所学的IO知识是可以完成的&#xff0c;不过需要非常繁琐的操作才可以完成&#xff0c;且开发中会遇到不同问题&#xff08;只读、读写&#xff0…

社交App广告优化新篇章:Xinstall引领用户体验升级,助力买量效果提升

随着移动互联网的快速发展&#xff0c;社交App已经成为人们生活中不可或缺的一部分。然而&#xff0c;在竞争激烈的市场环境下&#xff0c;如何有效地进行广告投放&#xff0c;吸引并留住用户&#xff0c;成为了每个社交App运营者面临的重大挑战。今天&#xff0c;我们就来谈谈…

乐观锁和悲观锁(MySQL和Java)

乐观锁和悲观锁(MySQL和Java) 在并发编程中&#xff0c;为了确保数据的一致性和完整性&#xff0c;我们通常需要使用锁机制来控制对共享资源的访问。锁主要分为两种&#xff1a;乐观锁和悲观锁。本文将详细介绍这两种锁的概念、工作原理以及它们的优缺点。 悲观锁 悲观锁(Pe…

字节码编程ASM之插桩方法执行耗时

写在前面 源码 。 本文看下如何对已有类进行插装。以最经典的方法执行耗时作为例子。 1&#xff1a;编码 假定有如下的代码&#xff1a; public class MyMethod {public String queryUserInfo(String uid) {System.out.println("xxxx");System.out.println("…

visual studio2022配置和使用protobuf

上图证明&#xff0c;我真的测了好多遍&#xff0c;测了好多版本的protobuf&#xff0c;花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

【递归、搜索与回溯】floodfill算法二

floodfill算法二 1.被围绕的区域2.太平洋大西洋水流问题3.扫雷游戏4.衣橱整理 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.被围绕的区域…

【OpenSSH】关于操作系统中的自带的SSH你知道怎么用吗

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、如何开启SSH服务2.1 什么是OpenSSH2.2 对于Windows 10, Windows 11系统2.2.1 如…

bug记录-XFTP传输中文文件夹乱码

bug记录-XFTP传输中文文件夹乱码 今日想往服务器中同步一些脚本,脚本文件夹是中文命名的,用XFTP导入后发现文件夹名称是乱码的 但是在XFTP上显示是正常的 这是因为window默认是GBK编码 linux是UTF-8编码 所以我们只需要把XFTP会话的编码改为UTF-8就可以了 首先点击文件-当前…