MySQL实训

项目名称与项目简介

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

该系统的主要功能包括:

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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用模板方法设计模式封装 socket 套接字并实现Tcp服务器和客户端 简单工厂模式设计

文章目录 使用模板方法设计模式封装套接字使用封装后的套接字实现Tcp服务器和客户端实现Tcp服务器实现Tcp客户端 工厂模式 使用模板方法设计模式封装套接字 可以使用模块方法设计模式来设计套接字 socket 的封装 模板方法&#xff08;Template Method&#xff09;设计模式是一…

CORE Mobility Errorr的调试

在运行CORE tutorial 3中的mobility示例时&#xff0c;出现如下错误&#xff1a; 当看到这个问题的时候&#xff0c;并没有仔细去分析日志和现象&#xff0c;在core-daemon的进程打印界面只看了一下最后的出错堆栈&#xff1a; 2024-06-27 10:43:48,614 - ERROR - _server:_ca…

微信小程序毕业设计-线上教育商城系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

无敌“水刊”,沾稿就收!5本机械工程方向SCI,100%录用,不退稿~评职/毕业首选~

在众多理工科专业中&#xff0c;计算机科学与人工智能、电子电气工程、机械工程、医学、土木工程、生物科学、化学工程以及数学与统计学等八个专业最吃香。 对于这些专业领域的毕业生和寻求职业晋升的在职人士而言&#xff0c;如何在学术界和工业界展现自己的研究成果和实力&am…

Type-C接口快充取电的优势及LDR6328的应用探讨

在当今这个快节奏的社会&#xff0c;电子设备已经成为我们生活中不可或缺的一部分。随着科技的不断发展&#xff0c;对于电子设备充电速度和效率的要求也越来越高。Type-C接口快充取电技术应运而生&#xff0c;以其独特的优势&#xff0c;成为了市场中的一股新势力。而LDR6328作…

家电品牌如何利用3D数字化技术,突破转型瓶颈?

家电行业正经历着从增量市场向存量市场的转变&#xff0c;用户的消费观念也日趋成熟&#xff0c;更加注重产品的体验和服务质量。无论是线上购物平台还是线下实体门店&#xff0c;提供个性化和增强体验感的产品与服务已成为家电市场未来发展的核心驱动力。 51建模网依托“3D数字…

手机如何录屏?小白也能秒变高手

随着智能手机的普及&#xff0c;手机录屏已经成为一种越来越普遍的需求。无论是录制游戏过程、分享操作教程&#xff0c;还是保留重要信息&#xff0c;手机录屏都发挥着重要作用。可是很多人不知道手机如何录屏&#xff0c;本文将介绍三种手机录屏方法&#xff0c;帮助大家轻松…

Java获取class对象3种方式,不同点解析。

Java获取class对象3种方式&#xff0c;不同点解析。 前言 Java获取class对象3种方式&#xff0c;不同点解析&#xff0c;他们是有区别的 创建目标类Apple进行演示&#xff01;&#xff01;&#xff01; OK&#xff01;结束&#xff01;我们就可以看出区别。

PH计仪器校准内容,以及相关注意事项内容

ph计大家一定不陌生&#xff0c;在日常生活中和实验场所&#xff0c;经常会有看到这种计量器具&#xff0c;作为测定ph值的常用仪器&#xff0c;其运用领域可谓十分广泛&#xff0c;不过因为其结构的特殊性&#xff0c;加上传感器的原理问题&#xff0c;其自身的计量校准也需要…

使用函数open()的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(void) {int fd-1;char filename[]"test.txt";fdopen(filename,O_RDWR);if(-1fd){printf("Open file %s failure!,fd…

六西格玛项目实战:数据驱动,手机PCM率直线下降

在当前智能手机市场日益竞争激烈的背景下&#xff0c;消费者对手机质量的要求达到了前所未有的高度。PCM&#xff08;可能指生产过程中的某种不良率或缺陷率&#xff09;作为影响手机质量的关键因素&#xff0c;直接关联到消费者满意度和品牌形象。为了应对这一挑战&#xff0c…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…

OpenGL3.3_C++_Windows(22)

材质&#xff1a; 决定物体在渲染过程中最终视觉呈现的关键因素之一&#xff0c;它通过一系列光学&#xff08;投光物&#xff09;和物理参数&#xff08;反光度&#xff0c;反照率、金属度&#xff0c;折射率……&#xff09;准确模拟现实世界中的材料特性&#xff0c;从而增…

MySQL高级-索引-使用规则-单列索引联合索引

文章目录 1、单列索引2、联合索引3、查看表索引4、创建 name 和 phone 索引5、查询 phone17799990010 and name韩信6、执行计划 phone17799990010 and name韩信7、创建联合唯一索引 idx_user_phone_name8、再次执行计划 phone17799990010 and name韩信9、使用了USE INDEX提示来…

echarts/自定义 环形进度条,源码+图片 复制运行 自取

进度图1&#xff1a; <!--* FilePath: index.vue* Author: 是十九呐* Date: 2024-06-26 17:56:34* LastEditTime: 2024-06-27 10:16:20 --> <template><div class"pieChartProgress-container"><div class"pieChartProgress-chart" :…

【Python机器学习】自动化特征选择——基于模型的特征选择

基于模型的特征选择使用一个监督机器学习模型来判断每个特征的重要性&#xff0c;并且仅保留最重要的特征。用于特征学习的监督模型不需要与用于最终建模的模型相同。特征选择模型需要为每个特征提供某种重要性度量&#xff0c;以便用这个度量对特征进行排序。决策树和基于决策…

3D立体卡片动效(附源码)

3D立体卡片动效 欢迎关注&#xff1a;xssy5431 小拾岁月参考链接&#xff1a;https://mp.weixin.qq.com/s/9xEjPAA38pRiIampxjXNKQ 效果展示 思路分析 需求含有立体这种关键词&#xff0c;我们第一反应是采用动画中的平移、倾斜等实现。如果是立体&#xff0c;必然产生阴影&…

哈喽GPT-4o,对GPT-4o 数据分析Data Analysis的思考与看法

目录 上传一个Excel给Data Analysis。Prompt&#xff1a;请问这个数据集是做什么的Prompt&#xff1a;请问书籍的定价如何&#xff0c;请用合适的图表展示它的售价情况Prompt&#xff1a;请统计书名列中出现最多的名称&#xff0c;然后使用词云将其可视化。Prompt&#xff1a;请…

FastGPT部署和OneAPI部署

FastGPT模型管理 FastGPT只支持openai 格式的restful 的api接口。 就是 chat/completion那个接口。如果不理解可以参考这个文章 https://zhuanlan.zhihu.com/p/656959227 。 支持Python 。JAVA 等后端语言或者 http 访问 因此如果想访问大模型&#xff0c;有以下几种方案&…

软件需求管理规程(DOC原件)

软件需求管理规程是确保软件开发过程中需求清晰、一致、可追踪的关键环节&#xff1a; 明确需求&#xff1a;项目初期&#xff0c;与利益相关者明确项目目标和需求&#xff0c;确保需求完整、无歧义。需求评审&#xff1a;组织专家团队对需求进行评审&#xff0c;识别潜在风险和…