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)

​-- 插入用户数据
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.mzph.cn/web/35498.shtml

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

相关文章

模拟物理弧线轨道运动(模拟飞盘,子弹运动)

模拟物理弧线运动&#xff08;模拟飞盘&#xff09; 介绍实现代码总结 介绍 模拟弧线的运动&#xff0c;并且对象始终朝向运动的方向&#xff0c;模拟飞盘子弹的运动轨迹。这里我是没有加重力这么一个概念的&#xff0c;当然了重力其实比较简单可以参考我之前写的模拟抛物线运动…

ubuntu 挂载新硬盘 记录

Ref 安全自动挂载硬盘&#xff0c; https://berylbot.com/archives/mount-disks-ubuntu 挂载新硬盘, https://berylbot.com/archives/mount-disks-ubuntu 1. 检查新硬盘是否被系统识别 lsblk -f 查看所有硬盘的UUID, 其中 mount point 为空则表示尚未挂载的硬盘。 列出所有可用…

ET9中ETTask传递新的Context原理

ET9中ETTask传递新的Context原理 前言 每一个异步函数都会创建两个对象&#xff0c; 第1个是当前异步函数返回值&#xff08;ETTASK&#xff09;对应的ETAsyncTaskMethodBuilder&#xff0c;通过这个类的静态方法Create创建返回&#xff0c;这个builder类中会有一个Task对象&…

idea 自动生成序列化数字

目标&#xff1a;当类继承Serializable后自动生成序列化Uid 网上查了很多说勾选class without ‘serialVersionUID’ 但是我勾选没用 最后发现&#xff0c;我勾选的是Serialization issues里面的配置&#xff0c;要勾选的是JVM languages下的 如下图所示&#xff0c;记录一下…

技术干货|SimLab 电子产品热流体仿真

电子产品热仿真特点有哪些&#xff1f; 结构复杂&#xff0c;电子设备包含几十~上千个元器件 体积小&#xff0c;功率密度高、关注热敏感元器件 多种冷却方式&#xff0c;自然冷却、风扇冷却、液冷、热管等 多维度&#xff0c;芯片级&#xff0c;板级&#xff0c;系统级 单…

昇思25天学习打卡营第03天|张量Tensor

何为张量&#xff1f; 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 &#x1d45b;维空间内&#xff0c;有  &#x1d45b;&a…

ppt模版免费下载网站大全

PPT是我们传达信息、分享知识、展示项目和进行商务沟通的重要工具。一个设计精美、布局合理的PPT不仅能吸引观众的注意力&#xff0c;还能有效提升演讲者的专业形象。PPT模版可以帮助我们高效制作出精美的PPT&#xff0c;下面小编就来和大家分享一些免费无需注册登录就可以直接…

Mysql进阶-索引-使用规则-索引失效情况二(or连接的条件、数据分布影响)

文章目录 1、or连接的条件1.1、展示 tb_user 索引1.2、查询 id10 or age231.3、执行计划 id10 or age231.4、给 age 创建 索引1.4、执行计划 phone17799990004 or age23 2、数据分布影响2.1、查询 tb_user2.2、查询 phone >177999900202.3、执行计划 phone >177999900202…

Python学习打卡:day17

day17 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day17121、Python 操作 MySQL 基础使用pymysql创建到 MySQL 的数据库链接执行 SQL 语句执行非查询性质的SQL语句执行查询性质的SQL语句 122、Pyth…

幻兽帕鲁Palworld樱花版本服务器一键开服联机

1、登录服务器&#xff08;百度莱卡云&#xff09; 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、在启动中调整游戏参数 2.1、重启服务器&#xff0c;等待running出现&#xff0c;或者运行时间变为灰色&#x…

Linux0.12内核源码解读(5)-head.s

大家好&#xff0c;我是呼噜噜&#xff0c;好久没有更新old linux了&#xff0c;本文接着上一篇文章图解CPU的实模式与保护模式&#xff0c;继续向着操作系统内核的世界前进&#xff0c;一起来看看heads.s as86 与GNU as 首先我们得了解一个事实&#xff0c;在Linux0.12内核源…

2024年6月27日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 Steam国产“类8番”游戏《永恒逃脱&#xff1a;暗影城堡》…

【JD-GUI】MacOS 中使用Java反编译工具JD-GUI

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明概念理解一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载与安装2.1 选择对应版本2.2 解压运行排除异常&#xff1a;2.3 关于…

GuiLite C语言实现版本

简介 本项目是idea4good/GuiLite的C语言实现版本&#xff0c;基于2024-06-20节点的版本&#xff08;提交ID&#xff1a;e9c4b57&#xff09;。 本项目仓库&#xff1a;GuiLite_C 需求说明 作为芯片从业人员&#xff0c;国产芯片普遍资源有限&#xff08;ROM和RAM比较少-都是…

[Vulnhub] wallabysnightmare LFI+RCE+Irssi聊天服务RCE

信息收集 Server IP AddressOpening Ports192.168.8.105TCP:22,80,6667,60080 $ nmap -p- -sC -sV 192.168.8.105 --min-rate 1000 -Pn 基础Shell http://192.168.8.105/?page../../../../../etc/shadow 当再次尝试访问已经关闭 $ nmap -p- -sC -sV 192.168.8.105 --min-rat…

【PTA】7-1 网红点打卡攻略(C/C++)代码实现 反思

解题细节分析&#xff1a; 0.比较图的两种存储方法&#xff0c;通过邻接矩阵存储更便于查找给定两点之间的关系 1.注意理解清楚题义&#xff1a;“访问所有网红点”中所有不是指攻略中所有&#xff0c;而是存在的全部的网红点 代码见下&#xff1a;// 需要注明的是&#xff…

锦江丽笙酒店稳步拓局海内外酒店市场 签约及意向合作20个新项目

&#xff08;中国上海&#xff0c;2024年6月27日&#xff09;民族品牌的国际化发展已日趋成为推动经济和文化交流的重要力量。作为民族品牌与国际品牌的融合发展&#xff0c;锦江丽笙酒店顺应市场趋势有序推进旗下品牌矩阵的全面布局&#xff1b;2024年上半年&#xff0c;已达成…

简易深度学习(1)深入分析神经元及多层感知机

一、神经元 单个神经元结构其实可以认为是一个线性回归模型。例如下图中 该神经元输入为三个特征&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff0c;为了方便理解&#xff0c;大家可以认为每条线上都有一个权重和特征对应&#xff08;w1&#xff0c;w2&…

从源码到上线:直播带货系统与短视频商城APP开发全流程

很多人问小编&#xff0c;一个完整的直播带货系统和短视频商城APP是如何从源码开发到最终上线的呢&#xff1f;今天&#xff0c;笔者将详细介绍这一全过程。 一、需求分析与规划 1.市场调研与需求分析&#xff1a;首先需要进行市场调研&#xff0c;了解当前市场的需求和竞争情…

入职必备-Git 2种方式拉取代码

【SSH方式】: 1.复制电子邮箱 2.git bash 打开窗口 ssh-keygen -t rsa -C liuchangprimecare.group 3.一路回车&#xff0c;然后查看C:\Users\LiuChang.ssh里面的文件 打开id_rsa.pub文件&#xff0c;复制代码 4.添加到GitLab的公钥输入框 5.然后 git clone gitgitlab.pr…