From 2773d0e9f8e7ccec5b41a8eb6424ec27a3ec4ae1 Mon Sep 17 00:00:00 2001 From: kejingfan Date: Thu, 1 Aug 2024 09:29:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84sql=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/initDb.sql | 151 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 database/initDb.sql diff --git a/database/initDb.sql b/database/initDb.sql new file mode 100644 index 0000000..0d63bf6 --- /dev/null +++ b/database/initDb.sql @@ -0,0 +1,151 @@ +DROP DATABASE IF EXISTS cardManageSystem; +CREATE DATABASE cardManageSystem; +ALTER DATABASE cardManageSystem CHARACTER SET utf8; + +DROP USER IF EXISTS 'cardManageSystem'@'%'; +CREATE USER 'cardManageSystem'@'%' IDENTIFIED BY 'RFID666'; + +USE cardManageSystem; + +DROP PROCEDURE IF EXISTS sp_depositCard; +DROP PROCEDURE IF EXISTS sp_consumeCard; + +CREATE TABLE device ( + id INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) UNIQUE, + depositAllowed TINYINT NOT NULL +) AUTO_INCREMENT=1000; + +CREATE TABLE `user` ( + id INT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL, + `password` VARCHAR(255) NOT NULL +); + +CREATE TABLE card ( + id VARCHAR(16) PRIMARY KEY, + `status` TINYINT NOT NULL, + balance DECIMAL(6, 2) NOT NULL, + userId INT, + FOREIGN KEY (userId) REFERENCES `user`(id), + CONSTRAINT chk_card_balance CHECK (balance >= 0) +); + +CREATE TABLE record ( + id VARCHAR(255) PRIMARY KEY, + cardId VARCHAR(16), + `time` DATETIME NOT NULL, + `type` TINYINT NOT NULL, + `value` DECIMAL(6, 2) NOT NULL, + originalBalance DECIMAL(6, 2) NOT NULL, + balance DECIMAL(6, 2) NOT NULL, + deviceId INT, + FOREIGN KEY (cardId) REFERENCES card(id), + FOREIGN KEY (deviceId) REFERENCES device(id), + CONSTRAINT chk_value CHECK (`value` >= -300), + CONSTRAINT chk_record CHECK (originalBalance + `value` = balance), + CONSTRAINT chk_record_originalBalance CHECK (originalBalance >= 0), + CONSTRAINT chk_record_balance CHECK (balance >= 0) +); + + +DELIMITER // + +CREATE PROCEDURE sp_depositCard( + IN p_cardId VARCHAR(16), + IN p_amount DECIMAL(6, 2), + IN p_recordId VARCHAR(255), + IN p_deviceId INT, + IN p_time DATETIME, + IN p_type TINYINT, + OUT p_newBalance DECIMAL(6, 2) +) +BEGIN + DECLARE v_originalBalance DECIMAL(6, 2); + + + SELECT balance INTO v_originalBalance + FROM card + WHERE id = p_cardId; + + IF v_originalBalance IS NULL THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Card not found'; + END IF; + + + SET p_newBalance = v_originalBalance + p_amount; + + + UPDATE card + SET balance = p_newBalance + WHERE id = p_cardId; + + + INSERT INTO record (id, cardId, `time`, `type`, `value`, originalBalance, balance, deviceId) + VALUES (p_recordId, p_cardId, p_time, p_type, p_amount, v_originalBalance, p_newBalance, p_deviceId); + +END // + + +CREATE PROCEDURE sp_consumeCard( + IN p_cardId VARCHAR(18), + IN p_amount DECIMAL(6, 2), + IN p_recordId VARCHAR(255), + IN p_deviceId INT, + IN p_time DATETIME, + IN p_type TINYINT, + OUT p_newBalance DECIMAL(6, 2) +) +BEGIN + DECLARE v_originalBalance DECIMAL(6, 2); + + IF p_amount > 300 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid Amount'; + END IF; + + + SELECT balance INTO v_originalBalance + FROM card + WHERE id = p_cardId; + + IF v_originalBalance IS NULL THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Card not found'; + END IF; + + + SET p_newBalance = v_originalBalance - p_amount; + + + IF p_newBalance < 0 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient balance'; + END IF; + + + UPDATE card + SET balance = p_newBalance + WHERE id = p_cardId; + + + INSERT INTO record (id, cardId, `time`, `type`, `value`, originalBalance, balance, deviceId) + VALUES (p_recordId, p_cardId, p_time, p_type, -p_amount, v_originalBalance, p_newBalance, p_deviceId); + +END // + +DELIMITER ; + + +CREATE VIEW record_view AS +SELECT time, type, value, balance, `name` AS device, record.id AS id, cardId +FROM record +JOIN device +ON deviceId = device.id +ORDER BY time DESC, type DESC; + + +INSERT INTO device (`name`, depositAllowed) +VALUES ('食堂1号机', 0), ('管理员1号机', 1); + + +GRANT ALL PRIVILEGES ON cardManageSystem.* TO 'cardManageSystem'@'%'; + +FLUSH PRIVILEGES; \ No newline at end of file