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_quantityFROM transactionsGROUP BY user_idORDER BY total_quantity DESCLIMIT 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`(-- 输入参数:用户 IDIN 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.rhkb.cn/news/363016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

用英文介绍美国总统Trump: Donald J. Trump Twice Impeached (2017 – 2021)

Donald J. Trump: Twice Impeached (2017 – 2021) Link: https://www.youtube.com/watch?vJ7RC2DKf6rs&listPLybg94GvOJ9E-ZM1U6PAjgPUmz-V4-Yja&index45 Summary Summary of Donald Trump’s Rise and Presidency Donald John Trump, originally from Queens, Ne…

【MTK平台】如何学习Bluedroid A2DP Code

一 Bluedroid A2DP架构图 备注: vendor/mediatek/proprietary/packages/modules/Bluetooth/system/audio_a2dp_hw/src 目录下编译生成audio.a2dp.default.so,主要实现a2dp做为设备的功能 二 A2DP File Hierarchy ModuleFileDescriptionAudio HAL (hardware/libhardware/…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示&#xff1a; 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…

RK3588 Android13 TvSetting 中性能浮窗RAM显示bug

前言 电视产品,客户发现在设备偏好设置->高级设置->性能浮窗菜单里显示的 RAM 大小是错误的, 要求改成正确的,并且屏幕密度修改后,这个浮窗显示不全,也需要一起处理。 效果图 TvSetting 部分修改文件清单 bug 原因在于 Formatter.formatFileSize 这个 API,我们…

聚观早报 | iPhone 16核心硬件曝光;三星Galaxy全球新品发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月28日消息 iPhone 16核心硬件曝光 三星Galaxy全球新品发布会 苹果正多方下注布局AI商店 黄仁勋2024年薪酬3400…

OpenHarmony开发实战:HDF驱动开发流程

概述 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路&#xff0c;让驱动开发和部署更加规范&#xff0c;旨在…

构建个人文件上传服务:Python Flask实现上传和下载完整指南

介绍 在本教程中&#xff0c;我们将学习如何使用Python Flask框架将文件上传到服务器&#xff0c;并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接&#xff0c;以便您可以轻松地跟随本教程。 准备工作 首先&#xff0c;您需要安装Python和F…

Java基础知识-线程

Java基础知识-线程 1、在 Java 中要想实现多线程代码有几种手段&#xff1f; 1. 一种是继承 Thread 类 2. 另一种就是实现 Runnable 接口 3. 最后一种就是实现 Callable 接口 4. 第四种也是实现 callable 接口&#xff0c;只不过有返回值而已 2、Thread 类中的 start() 和 …

Python 面试【★★★】

阐述以下方法 classmethod, staticmethod, property&#xff1f; 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;

手机远程控制另一台手机的全新使用教程(安卓版)

看完这篇文章&#xff0c;你可以了解到安卓手机如何远程控制安卓手机&#xff0c;以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机&#xff0c;或者苹果手机远程管控另一台苹果手机&#xff0c;请点击查看视频《手机远程管控另一台手机的全新使用教程…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心&#xff1a;全局事务id&#xff0c;xid&#xff0c;在调用服务链路的上下文中进行传播。TC(Transa…

使用API有效率地管理Dynadot域名,为文件夹中的域名设置域名转发

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

VUE大屏的开发过程(纯前端)

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;工作多年做过各类项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论和学习的问题可联系我&#xff1a;1…

基于Redis和openresty实现高并发缓存架构

目录 概述缓存架构设计实践代码路由业务封装redis 效果 概述 本文是对项目中 QPS 高并发相关问题的一种解决方案&#xff0c;利用 Nginx 与 Redis 的高并发、超低延迟响应&#xff0c;结合 Canal 进行实现。 openrestry官网 当程序需要提供较高的并发访问时&#xff0c;往往需…

基于大数据架构的内容安全风控与分析

1 项目介绍 1.1 研究目的和意义 在数字化时代&#xff0c;内容安全成为了互联网企业面临的一个重要挑战。海量数据的产生与传播&#xff0c;伴随着不良信息和网络安全威胁的日益增加。因此&#xff0c;本课题旨在通过构建一个基于大数据架构的内容安全风控与分析系统&#xf…

概率论论文(关于“到课率”的贝叶斯推理应用)

概率论论文(关于“到课率”的贝叶斯推理应用) 全条件概率公式和贝叶斯公式趣味识 思考1&#xff1a; (引自贝叶斯公式及朴素贝叶斯分类算法应用初探) “狼来了”的故事想必大家都知道&#xff0c;小孩子第三次对村民说狼来了的时候&#xff0c;村民们没有相信他的话&#xff0…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;农场资讯管理&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品类型管理 开发系统&#xff1a;Windows 架构模式&…

【新手友好】计算机SCI期刊,IF=3+,编辑负责,修改稿件认真

一、期刊名称 Journal of Communications and Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.6 中科院分区&#xff1a;3区 三、期刊征稿范围 《通信与网络杂志》每年出版六期&#xff0c;致力于发表高质量的…