添加初始化数据库的sql脚本
This commit is contained in:
parent
458d7edc6a
commit
2773d0e9f8
151
database/initDb.sql
Normal file
151
database/initDb.sql
Normal file
@ -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;
|
Loading…
x
Reference in New Issue
Block a user