数据库sql语句最终提交

main
cao 8 months ago
parent f2cca7697b
commit 59a2e28747

@ -0,0 +1,333 @@
-- 创建数据库
-- 创建数据表
CREATE TABLE admin (
admin_name VARCHAR(255) PRIMARY KEY,
password VARCHAR(255) NOT NULL
);
CREATE TABLE account (
account_id SERIAL PRIMARY KEY,
type VARCHAR(50),
status VARCHAR(50),
created_by VARCHAR(255) REFERENCES admin(admin_name)
);
CREATE TABLE venue (
venue_id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
capacity INT NOT NULL CHECK (capacity > 0)
);
CREATE TABLE student (
student_id VARCHAR(255) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
personal_info_id INT UNIQUE,
FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id)
);
CREATE TABLE coach (
coach_id VARCHAR(255) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
personal_info_id INT UNIQUE,
FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id)
);
CREATE TABLE appointment (
appointment_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id),
venue_id INT NOT NULL REFERENCES venue(venue_id),
period VARCHAR(50) NOT NULL,
status VARCHAR(50) NOT NULL,
feedback_id INT REFERENCES feedback(feedback_id)
);
CREATE TABLE feedback (
feedback_id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
date DATE NOT NULL
);
CREATE TABLE invoice (
invoice_id SERIAL PRIMARY KEY,
amount DECIMAL(10, 2) NOT NULL CHECK (amount >= 0),
date DATE NOT NULL,
appointment_id INT REFERENCES appointment(appointment_id)
);
CREATE TABLE personal_info (
info_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
phone VARCHAR(20),
email VARCHAR(255)
);
CREATE TABLE training_record (
record_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id),
feedback TEXT,
appointment_id INT REFERENCES appointment(appointment_id)
);
CREATE TABLE booking_slot (
slot_id SERIAL PRIMARY KEY,
start_time TIME NOT NULL,
end_time TIME NOT NULL CHECK (end_time > start_time),
venue_id INT NOT NULL REFERENCES venue(venue_id)
);
-- 初始化ADMIN表
INSERT INTO admin (admin_name, password) VALUES ('admin1', 'password1');
INSERT INTO admin (admin_name, password) VALUES ('admin2', 'password2');
-- 初始化ACCOUNT表
INSERT INTO account (type, status, created_by) VALUES ('student', 'active', 'admin1');
INSERT INTO account (type, status, created_by) VALUES ('coach', 'active', 'admin1');
-- 初始化VENUE表
INSERT INTO venue (name, capacity) VALUES ('Venue A', 10);
INSERT INTO venue (name, capacity) VALUES ('Venue B', 15);
-- 初始化STUDENT表
INSERT INTO personal_info (phone, email) VALUES ('1234567890', 'student1@example.com');
INSERT INTO student (student_id, name, password, personal_info_id) VALUES ('S001', 'Student One', 'pass1', 1);
-- 初始化COACH表
INSERT INTO personal_info (phone, email) VALUES ('0987654321', 'coach1@example.com');
INSERT INTO coach (coach_id, name, password, personal_info_id) VALUES ('C001', 'Coach One', 'pass1', 2);
-- 初始化APPOINTMENT表
INSERT INTO appointment (student_id, coach_id, venue_id, period, status) VALUES ('S001', 'C001', 1, 'Morning', 'Scheduled');
-- 初始化FEEDBACK表
INSERT INTO feedback (content, date) VALUES ('Great session!', '2024-12-01');
-- 初始化INVOICE表
INSERT INTO invoice (amount, date, appointment_id) VALUES (100.00, '2024-12-01', 1);
-- 初始化TRAINING_RECORD表
INSERT INTO training_record (student_id, coach_id, feedback, appointment_id) VALUES ('S001', 'C001', 'Good progress.', 1);
-- 初始化BOOKING_SLOT表
INSERT INTO booking_slot (start_time, end_time, venue_id) VALUES ('09:00:00', '10:00:00', 1);
-- 学生信息视图
CREATE VIEW StudentInfoView AS
SELECT s.student_id, s.name, p.phone, p.email
FROM student s
JOIN personal_info p ON s.personal_info_id = p.info_id;
-- 教练信息视图
CREATE VIEW CoachInfoView AS
SELECT c.coach_id, c.name, p.phone, p.email
FROM coach c
JOIN personal_info p ON c.personal_info_id = p.info_id;
-- 预约详情视图
CREATE VIEW AppointmentDetailView AS
SELECT a.appointment_id, s.name AS student_name, c.name AS coach_name, v.name AS venue_name, a.period, a.status
FROM appointment a
JOIN student s ON a.student_id = s.student_id
JOIN coach c ON a.coach_id = c.coach_id
JOIN venue v ON a.venue_id = v.venue_id;
-- 训练记录视图
CREATE VIEW TrainingRecordView AS
SELECT t.record_id, s.name AS student_name, c.name AS coach_name, t.feedback
FROM training_record t
JOIN student s ON t.student_id = s.student_id
JOIN coach c ON t.coach_id = c.coach_id;
-- 发票详情视图
CREATE VIEW InvoiceDetailView AS
SELECT i.invoice_id, i.amount, i.date, a.student_id, a.coach_id, a.venue_id
FROM invoice i
JOIN appointment a ON i.appointment_id = a.appointment_id;
-- 在appointment表的period字段上创建索引
CREATE INDEX idx_appointment_period ON appointment(period);
-- 在feedback表的date字段上创建索引
CREATE INDEX idx_feedback_date ON feedback(date);
-- 在invoice表的date字段上创建索引
CREATE INDEX idx_invoice_date ON invoice(date);
-- 在training_record表的record_id字段上创建索引
CREATE INDEX idx_training_record_record_id ON training_record(record_id);
-- 在booking_slot表的start_time和end_time字段上创建复合索引
CREATE INDEX idx_booking_slot_start_end_time ON booking_slot(start_time, end_time);
-- 在account表的status字段上创建索引
CREATE INDEX idx_account_status ON account(status);
-- 在student表的name字段上创建索引
CREATE INDEX idx_student_name ON student(name);
-- 在coach表的name字段上创建索引
CREATE INDEX idx_coach_name ON coach(name);
-- 在venue表的name字段上创建索引
CREATE INDEX idx_venue_name ON venue(name);
-- 在personal_info表的email字段上创建唯一索引
CREATE UNIQUE INDEX idx_personal_info_email ON personal_info(email);
-- 添加新学员的存储过程
CREATE OR REPLACE FUNCTION AddNewStudent(
_student_id VARCHAR(255),
_name VARCHAR(255),
_password VARCHAR(255),
_phone VARCHAR(20),
_email VARCHAR(255)
) RETURNS VOID AS $$
DECLARE
_info_id INT;
BEGIN
INSERT INTO personal_info (phone, email) VALUES (_phone, _email) RETURNING info_id INTO _info_id;
INSERT INTO student (student_id, name, password, personal_info_id) VALUES (_student_id, _name, _password, _info_id);
END;
$$ LANGUAGE plpgsql;
-- 更新教练电话的存储过程
CREATE OR REPLACE FUNCTION UpdateCoachPhone(
_coach_id VARCHAR(255),
_new_phone VARCHAR(20)
) RETURNS VOID AS $$
BEGIN
UPDATE personal_info SET phone = _new_phone WHERE info_id = (SELECT personal_info_id FROM coach WHERE coach_id = _coach_id);
END;
$$ LANGUAGE plpgsql;
-- 获取某个学生的所有预约的存储过程
CREATE OR REPLACE FUNCTION GetStudentAppointments(
_student_id VARCHAR(255)
) RETURNS TABLE(appointment_id INT, coach_name VARCHAR(255), venue_name VARCHAR(255), period VARCHAR(50), status VARCHAR(50)) AS $$
BEGIN
RETURN QUERY
SELECT a.appointment_id, c.name AS coach_name, v.name AS venue_name, a.period, a.status
FROM appointment a
JOIN coach c ON a.coach_id = c.coach_id
JOIN venue v ON a.venue_id = v.venue_id
WHERE a.student_id = _student_id;
END;
$$ LANGUAGE plpgsql;
-- 获取某个教练的所有反馈的存储过程
CREATE OR REPLACE FUNCTION GetCoachFeedbacks(
_coach_id VARCHAR(255)
) RETURNS TABLE(feedback_id INT, content TEXT, date DATE) AS $$
BEGIN
RETURN QUERY
SELECT f.feedback_id, f.content, f.date
FROM feedback f
JOIN training_record t ON f.feedback_id = t.feedback_id
WHERE t.coach_id = _coach_id;
END;
$$ LANGUAGE plpgsql;
-- 获取某个场地的所有可用时间段的存储过程
CREATE OR REPLACE FUNCTION GetAvailableSlotsForVenue(
_venue_id INT
) RETURNS TABLE(slot_id INT, start_time TIME, end_time TIME) AS $$
BEGIN
RETURN QUERY
SELECT bs.slot_id, bs.start_time, bs.end_time
FROM booking_slot bs
LEFT JOIN appointment a ON bs.venue_id = a.venue_id AND bs.start_time <= a.period::time AND bs.end_time >= a.period::time
WHERE bs.venue_id = _venue_id AND a.appointment_id IS NULL;
END;
$$ LANGUAGE plpgsql;
-- 当插入新的学生时自动在personal_info表中插入一条记录
CREATE OR REPLACE FUNCTION InsertPersonalInfoOnStudentInsert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO personal_info (phone, email) VALUES ('', '');
NEW.personal_info_id := currval('personal_info_info_id_seq');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_insert_personal_info_on_student_insert
BEFORE INSERT ON student
FOR EACH ROW EXECUTE FUNCTION InsertPersonalInfoOnStudentInsert();
-- 当删除一个教练时自动删除其关联的personal_info记录
CREATE OR REPLACE FUNCTION DeletePersonalInfoOnCoachDelete()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM personal_info WHERE info_id = OLD.personal_info_id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_personal_info_on_coach_delete
AFTER DELETE ON coach
FOR EACH ROW EXECUTE FUNCTION DeletePersonalInfoOnCoachDelete();
-- 当插入新的预约时,检查是否已经有重叠的时间段
CREATE OR REPLACE FUNCTION CheckOverlapBeforeAppointmentInsert()
RETURNS TRIGGER AS $$
DECLARE
overlap_count INT;
BEGIN
SELECT COUNT(*) INTO overlap_count
FROM appointment a
WHERE a.venue_id = NEW.venue_id
AND ((a.period = NEW.period)
OR (a.period < NEW.period AND a.period + INTERVAL '1 hour' > NEW.period)
OR (a.period > NEW.period AND a.period < NEW.period + INTERVAL '1 hour'));
IF overlap_count > 0 THEN
RAISE EXCEPTION 'There is an overlapping appointment at the same time and place.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_check_overlap_before_appointment_insert
BEFORE INSERT ON appointment
FOR EACH ROW EXECUTE FUNCTION CheckOverlapBeforeAppointmentInsert();
-- 当更新发票金额时,确保金额不小于零
CREATE OR REPLACE FUNCTION EnsureInvoiceAmountNonNegative()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.amount < 0 THEN
RAISE EXCEPTION 'Invoice amount cannot be negative.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_ensure_invoice_amount_non_negative
BEFORE UPDATE ON invoice
FOR EACH ROW EXECUTE FUNCTION EnsureInvoiceAmountNonNegative();
-- 创建角色
CREATE ROLE AdminRole LOGIN PASSWORD 'admin_password';
CREATE ROLE CoachRole LOGIN PASSWORD 'coach_password';
CREATE ROLE StudentRole LOGIN PASSWORD 'student_password';
-- 授予AdminRole权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE account_account_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE venue_venue_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE student_student_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE coach_coach_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE appointment_appointment_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE feedback_feedback_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE invoice_invoice_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE personal_info_info_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE training_record_record_id_seq TO AdminRole;
GRANT USAGE, SELECT, UPDATE ON SEQUENCE booking_slot_slot_id_seq TO AdminRole;
-- 授予CoachRole权限
GRANT SELECT, INSERT, UPDATE ON appointment TO CoachRole;
GRANT SELECT, INSERT, UPDATE ON feedback TO CoachRole;
GRANT SELECT, INSERT, UPDATE ON training_record TO CoachRole;
-- 授予StudentRole权限
GRANT SELECT, INSERT, UPDATE ON appointment TO StudentRole;
GRANT SELECT, INSERT, UPDATE ON feedback TO StudentRole;
GRANT SELECT, INSERT, UPDATE ON training_record TO StudentRole;
GRANT SELECT ON invoice TO StudentRole;

@ -0,0 +1,79 @@
-- 创建数据表
CREATE TABLE admin (
admin_name VARCHAR(255) PRIMARY KEY,
password VARCHAR(255) NOT NULL
);
CREATE TABLE account (
account_id SERIAL PRIMARY KEY,
type VARCHAR(50),
status VARCHAR(50),
created_by VARCHAR(255) REFERENCES admin(admin_name)
);
CREATE TABLE venue (
venue_id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
capacity INT NOT NULL CHECK (capacity > 0)
);
CREATE TABLE student (
student_id VARCHAR(255) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
personal_info_id INT UNIQUE,
FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id)
);
CREATE TABLE coach (
coach_id VARCHAR(255) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
personal_info_id INT UNIQUE,
FOREIGN KEY (personal_info_id) REFERENCES personal_info(info_id)
);
CREATE TABLE appointment (
appointment_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id),
venue_id INT NOT NULL REFERENCES venue(venue_id),
period VARCHAR(50) NOT NULL,
status VARCHAR(50) NOT NULL,
feedback_id INT REFERENCES feedback(feedback_id)
);
CREATE TABLE feedback (
feedback_id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
date DATE NOT NULL
);
CREATE TABLE invoice (
invoice_id SERIAL PRIMARY KEY,
amount DECIMAL(10, 2) NOT NULL CHECK (amount >= 0),
date DATE NOT NULL,
appointment_id INT REFERENCES appointment(appointment_id)
);
CREATE TABLE personal_info (
info_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
phone VARCHAR(20),
email VARCHAR(255)
);
CREATE TABLE training_record (
record_id SERIAL PRIMARY KEY,
student_id VARCHAR(255) NOT NULL REFERENCES student(student_id),
coach_id VARCHAR(255) NOT NULL REFERENCES coach(coach_id),
feedback TEXT,
appointment_id INT REFERENCES appointment(appointment_id)
);
CREATE TABLE booking_slot (
slot_id SERIAL PRIMARY KEY,
start_time TIME NOT NULL,
end_time TIME NOT NULL CHECK (end_time > start_time),
venue_id INT NOT NULL REFERENCES venue(venue_id)
);

@ -0,0 +1,30 @@
-- 在appointment表的period字段上创建索引
CREATE INDEX idx_appointment_period ON appointment(period);
-- 在feedback表的date字段上创建索引
CREATE INDEX idx_feedback_date ON feedback(date);
-- 在invoice表的date字段上创建索引
CREATE INDEX idx_invoice_date ON invoice(date);
-- 在training_record表的record_id字段上创建索引
CREATE INDEX idx_training_record_record_id ON training_record(record_id);
-- 在booking_slot表的start_time和end_time字段上创建复合索引
CREATE INDEX idx_booking_slot_start_end_time ON booking_slot(start_time, end_time);
-- 在account表的status字段上创建索引
CREATE INDEX idx_account_status ON account(status);
-- 在student表的name字段上创建索引
CREATE INDEX idx_student_name ON student(name);
-- 在coach表的name字段上创建索引
CREATE INDEX idx_coach_name ON coach(name);
-- 在venue表的name字段上创建索引
CREATE INDEX idx_venue_name ON venue(name);
-- 在personal_info表的email字段上创建唯一索引
CREATE UNIQUE INDEX idx_personal_info_email ON personal_info(email);
-- 添加新学员的存储过程

@ -0,0 +1,32 @@
-- 学生信息视图
CREATE VIEW StudentInfoView AS
SELECT s.student_id, s.name, p.phone, p.email
FROM student s
JOIN personal_info p ON s.personal_info_id = p.info_id;
-- 教练信息视图
CREATE VIEW CoachInfoView AS
SELECT c.coach_id, c.name, p.phone, p.email
FROM coach c
JOIN personal_info p ON c.personal_info_id = p.info_id;
-- 预约详情视图
CREATE VIEW AppointmentDetailView AS
SELECT a.appointment_id, s.name AS student_name, c.name AS coach_name, v.name AS venue_name, a.period, a.status
FROM appointment a
JOIN student s ON a.student_id = s.student_id
JOIN coach c ON a.coach_id = c.coach_id
JOIN venue v ON a.venue_id = v.venue_id;
-- 训练记录视图
CREATE VIEW TrainingRecordView AS
SELECT t.record_id, s.name AS student_name, c.name AS coach_name, t.feedback
FROM training_record t
JOIN student s ON t.student_id = s.student_id
JOIN coach c ON t.coach_id = c.coach_id;
-- 发票详情视图
CREATE VIEW InvoiceDetailView AS
SELECT i.invoice_id, i.amount, i.date, a.student_id, a.coach_id, a.venue_id
FROM invoice i
JOIN appointment a ON i.appointment_id = a.appointment_id;

@ -0,0 +1,801 @@
-- MySQL dump 10.13 Distrib 8.0.19, for Win64 (x86_64)
--
-- Host: localhost Database: DrivingSchool
-- ------------------------------------------------------
-- Server version 8.0.40
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `account`
--
DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `account` (
`account_id` int NOT NULL AUTO_INCREMENT,
`type` varchar(50) DEFAULT NULL,
`status` varchar(50) DEFAULT NULL,
`created_by` varchar(255) DEFAULT NULL,
PRIMARY KEY (`account_id`),
KEY `created_by` (`created_by`),
CONSTRAINT `account_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `admin` (`admin_name`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `account`
--
LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
INSERT INTO `account` VALUES (1,'管理员','活跃','张伟'),(2,'学员','活跃','张伟'),(3,'教练','活跃','李娜'),(4,'学员','停用','李娜'),(5,'管理员','活跃','李娜'),(6,'学员','活跃','张伟'),(7,'教练','活跃','张伟'),(8,'学员','活跃','李娜'),(9,'教练','停用','张伟'),(10,'学员','活跃','李娜');
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `admin`
--
DROP TABLE IF EXISTS `admin`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `admin` (
`admin_name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`admin_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `admin`
--
LOCK TABLES `admin` WRITE;
/*!40000 ALTER TABLE `admin` DISABLE KEYS */;
INSERT INTO `admin` VALUES ('张伟','password123'),('李娜','securepass');
/*!40000 ALTER TABLE `admin` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `appointment`
--
DROP TABLE IF EXISTS `appointment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `appointment` (
`appointment_id` int NOT NULL AUTO_INCREMENT,
`student_id` varchar(255) NOT NULL,
`coach_id` varchar(255) NOT NULL,
`venue_id` int NOT NULL,
`period` varchar(50) NOT NULL,
`status` varchar(50) NOT NULL,
`feedback_id` int DEFAULT NULL,
PRIMARY KEY (`appointment_id`),
KEY `feedback_id` (`feedback_id`),
KEY `idx_appointment_student` (`student_id`),
KEY `idx_appointment_coach` (`coach_id`),
KEY `idx_appointment_venue` (`venue_id`),
KEY `idx_appointment_period` (`period`),
KEY `idx_appointment_status` (`status`),
CONSTRAINT `appointment_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`),
CONSTRAINT `appointment_ibfk_2` FOREIGN KEY (`coach_id`) REFERENCES `coach` (`coach_id`),
CONSTRAINT `appointment_ibfk_3` FOREIGN KEY (`venue_id`) REFERENCES `venue` (`venue_id`),
CONSTRAINT `appointment_ibfk_4` FOREIGN KEY (`feedback_id`) REFERENCES `feedback` (`feedback_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `appointment`
--
LOCK TABLES `appointment` WRITE;
/*!40000 ALTER TABLE `appointment` DISABLE KEYS */;
INSERT INTO `appointment` VALUES (1,'S001','C001',1,'上午','已确认',NULL),(2,'S002','C002',2,'下午','待确认',NULL),(3,'S003','C003',3,'上午','已取消',NULL),(4,'S004','C004',4,'下午','已确认',NULL),(5,'S005','C005',5,'上午','待确认',NULL),(6,'S006','C006',6,'下午','已确认',NULL),(7,'S007','C007',7,'上午','已确认',NULL),(8,'S008','C008',8,'下午','待确认',NULL),(9,'S009','C009',9,'上午','已取消',NULL),(10,'S010','C010',10,'下午','已确认',NULL);
/*!40000 ALTER TABLE `appointment` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_appointment_update` AFTER UPDATE ON `appointment` FOR EACH ROW BEGIN
IF OLD.status <> NEW.status THEN
INSERT INTO log (table_name, record_id, action, details)
VALUES ('appointment', NEW.appointment_id, 'update', CONCAT('Status changed from ', OLD.status, ' to ', NEW.status));
END IF;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Temporary view structure for view `appointment_details`
--
DROP TABLE IF EXISTS `appointment_details`;
/*!50001 DROP VIEW IF EXISTS `appointment_details`*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `appointment_details` AS SELECT
1 AS `appointment_id`,
1 AS `student_name`,
1 AS `coach_name`,
1 AS `venue_name`,
1 AS `period`,
1 AS `status`*/;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `booking_slot`
--
DROP TABLE IF EXISTS `booking_slot`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `booking_slot` (
`slot_id` int NOT NULL AUTO_INCREMENT,
`start_time` time NOT NULL,
`end_time` time NOT NULL,
`venue_id` int NOT NULL,
PRIMARY KEY (`slot_id`),
KEY `venue_id` (`venue_id`),
CONSTRAINT `booking_slot_ibfk_1` FOREIGN KEY (`venue_id`) REFERENCES `venue` (`venue_id`),
CONSTRAINT `booking_slot_chk_1` CHECK ((`end_time` > `start_time`))
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `booking_slot`
--
LOCK TABLES `booking_slot` WRITE;
/*!40000 ALTER TABLE `booking_slot` DISABLE KEYS */;
INSERT INTO `booking_slot` VALUES (1,'09:00:00','10:00:00',1),(2,'10:00:00','11:00:00',1),(3,'11:00:00','12:00:00',1),(4,'14:00:00','15:00:00',2),(5,'15:00:00','16:00:00',2),(6,'16:00:00','17:00:00',2),(7,'09:00:00','10:00:00',3),(8,'10:00:00','11:00:00',3),(9,'11:00:00','12:00:00',3),(10,'14:00:00','15:00:00',3);
/*!40000 ALTER TABLE `booking_slot` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `coach`
--
DROP TABLE IF EXISTS `coach`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `coach` (
`coach_id` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`personal_info_id` int DEFAULT NULL,
PRIMARY KEY (`coach_id`),
KEY `personal_info_id` (`personal_info_id`),
KEY `idx_coach_name` (`name`),
CONSTRAINT `coach_ibfk_1` FOREIGN KEY (`personal_info_id`) REFERENCES `personal_info` (`info_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `coach`
--
LOCK TABLES `coach` WRITE;
/*!40000 ALTER TABLE `coach` DISABLE KEYS */;
INSERT INTO `coach` VALUES ('C001','王五','coachpass1',3),('C002','赵六','coachpass2',4),('C003','陈翔宇','coachpass3',7),('C004','赵嘉琪','coachpass4',9),('C005','黄涛','coachpass5',NULL),('C006','钱芳','coachpass6',NULL),('C007','朱刚','coachpass7',NULL),('C008','孙莉','coachpass8',NULL),('C009','郑凯','coachpass9',NULL),('C010','林敏','coachpass10',NULL);
/*!40000 ALTER TABLE `coach` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_coach_update` AFTER UPDATE ON `coach` FOR EACH ROW BEGIN
IF OLD.name <> NEW.name OR OLD.password <> NEW.password THEN
INSERT INTO log (table_name, record_id, action, details)
VALUES ('coach', NEW.coach_id, 'update', CONCAT('Name or password updated'));
END IF;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Temporary view structure for view `coach_details`
--
DROP TABLE IF EXISTS `coach_details`;
/*!50001 DROP VIEW IF EXISTS `coach_details`*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `coach_details` AS SELECT
1 AS `coach_id`,
1 AS `coach_name`,
1 AS `phone`,
1 AS `email`,
1 AS `status`*/;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `feedback`
--
DROP TABLE IF EXISTS `feedback`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `feedback` (
`feedback_id` int NOT NULL AUTO_INCREMENT,
`content` text NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`feedback_id`),
KEY `idx_feedback_date` (`date`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `feedback`
--
LOCK TABLES `feedback` WRITE;
/*!40000 ALTER TABLE `feedback` DISABLE KEYS */;
INSERT INTO `feedback` VALUES (1,'教练非常耐心,教学很好!','2023-10-01'),(2,'场地设施齐全,体验不错。','2023-10-02'),(3,'课程安排合理,推荐这里学车。','2023-10-03'),(4,'教练态度好,进步很快。','2023-10-04'),(5,'学习氛围浓厚,值得信赖。','2023-10-05'),(6,'教练很专业,感谢指导。','2023-10-06'),(7,'场地干净整洁,感觉舒适。','2023-10-07'),(8,'课程内容丰富,收获颇丰。','2023-10-08'),(9,'教练很有经验,帮助很大。','2023-10-09'),(10,'场地条件优越,性价比高。','2023-10-10');
/*!40000 ALTER TABLE `feedback` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `before_feedback_delete` BEFORE DELETE ON `feedback` FOR EACH ROW BEGIN
DECLARE expiry_date DATE;
SET expiry_date = CURDATE() - INTERVAL 1 YEAR; -- 假设过期时间为一年前
IF OLD.date < expiry_date THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete expired feedback';
END IF;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Table structure for table `invoice`
--
DROP TABLE IF EXISTS `invoice`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `invoice` (
`invoice_id` int NOT NULL AUTO_INCREMENT,
`amount` decimal(10,2) NOT NULL,
`date` date NOT NULL,
`appointment_id` int DEFAULT NULL,
PRIMARY KEY (`invoice_id`),
KEY `appointment_id` (`appointment_id`),
KEY `idx_invoice_amount` (`amount`),
KEY `idx_invoice_date` (`date`),
CONSTRAINT `invoice_ibfk_1` FOREIGN KEY (`appointment_id`) REFERENCES `appointment` (`appointment_id`),
CONSTRAINT `invoice_chk_1` CHECK ((`amount` >= 0))
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `invoice`
--
LOCK TABLES `invoice` WRITE;
/*!40000 ALTER TABLE `invoice` DISABLE KEYS */;
INSERT INTO `invoice` VALUES (1,1500.00,'2023-10-01',1),(2,1800.00,'2023-10-02',2),(3,2000.00,'2023-10-03',3),(4,1700.00,'2023-10-04',4),(5,1600.00,'2023-10-05',5),(6,1900.00,'2023-10-06',6),(7,1400.00,'2023-10-07',7),(8,1550.00,'2023-10-08',8),(9,1650.00,'2023-10-09',9),(10,1750.00,'2023-10-10',10);
/*!40000 ALTER TABLE `invoice` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_invoice_insert` AFTER INSERT ON `invoice` FOR EACH ROW BEGIN
UPDATE account
SET status = '已支付'
WHERE account_id = (
SELECT student_id FROM appointment WHERE appointment_id = NEW.appointment_id
);
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Temporary view structure for view `invoice_details`
--
DROP TABLE IF EXISTS `invoice_details`;
/*!50001 DROP VIEW IF EXISTS `invoice_details`*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `invoice_details` AS SELECT
1 AS `invoice_id`,
1 AS `amount`,
1 AS `invoice_date`,
1 AS `student_name`,
1 AS `coach_name`*/;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `log`
--
DROP TABLE IF EXISTS `log`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `log` (
`log_id` int NOT NULL AUTO_INCREMENT,
`table_name` varchar(50) DEFAULT NULL,
`record_id` int DEFAULT NULL,
`action` varchar(50) DEFAULT NULL,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`details` text,
PRIMARY KEY (`log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `log`
--
LOCK TABLES `log` WRITE;
/*!40000 ALTER TABLE `log` DISABLE KEYS */;
/*!40000 ALTER TABLE `log` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `personal_info`
--
DROP TABLE IF EXISTS `personal_info`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `personal_info` (
`info_id` int NOT NULL AUTO_INCREMENT,
`student_id` varchar(255) NOT NULL,
`phone` varchar(20) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`info_id`),
UNIQUE KEY `student_id` (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `personal_info`
--
LOCK TABLES `personal_info` WRITE;
/*!40000 ALTER TABLE `personal_info` DISABLE KEYS */;
INSERT INTO `personal_info` VALUES (1,'S001','13800138000','zhangsan@example.com'),(2,'S002','13900139000','lisi@example.com'),(3,'C001','13700137000','wangwu@example.com'),(4,'C002','13600136000','zhaoliu@example.com'),(5,'S003','13500135000','sunbaohua@example.com'),(6,'S004','13400134000','liwenbo@example.com'),(7,'C003','13300133000','chenxiangyu@example.com'),(8,'S005','13200132000','yangming@example.com'),(9,'C004','13100131000','zhaojiaqi@example.com'),(10,'S006','13000130000','wulifei@example.com');
/*!40000 ALTER TABLE `personal_info` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `student`
--
DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `student` (
`student_id` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`personal_info_id` int DEFAULT NULL,
PRIMARY KEY (`student_id`),
KEY `personal_info_id` (`personal_info_id`),
KEY `idx_student_name` (`name`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`personal_info_id`) REFERENCES `personal_info` (`info_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `student`
--
LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES ('S001','张三','studypass1',1),('S002','李四','studypass2',2),('S003','孙宝华','studypass3',5),('S004','李文博','studypass4',6),('S005','杨明','studypass5',8),('S006','吴雷飞','studypass6',10),('S007','刘强','studypass7',NULL),('S008','王丽','studypass8',NULL),('S009','陈杰','studypass9',NULL),('S010','周梅','studypass10',NULL);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `after_student_insert` AFTER INSERT ON `student` FOR EACH ROW BEGIN
INSERT INTO account (account_id, type, status, created_by)
VALUES (NEW.student_id, '学员', '活跃', '张伟');
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Temporary view structure for view `student_appointment_feedback`
--
DROP TABLE IF EXISTS `student_appointment_feedback`;
/*!50001 DROP VIEW IF EXISTS `student_appointment_feedback`*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `student_appointment_feedback` AS SELECT
1 AS `student_name`,
1 AS `coach_name`,
1 AS `appointment_period`,
1 AS `appointment_status`,
1 AS `feedback_content`,
1 AS `feedback_date`*/;
SET character_set_client = @saved_cs_client;
--
-- Temporary view structure for view `student_details`
--
DROP TABLE IF EXISTS `student_details`;
/*!50001 DROP VIEW IF EXISTS `student_details`*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `student_details` AS SELECT
1 AS `student_id`,
1 AS `student_name`,
1 AS `phone`,
1 AS `email`,
1 AS `status`*/;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `training_record`
--
DROP TABLE IF EXISTS `training_record`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `training_record` (
`record_id` int NOT NULL AUTO_INCREMENT,
`student_id` varchar(255) NOT NULL,
`coach_id` varchar(255) NOT NULL,
`feedback` text,
`appointment_id` int DEFAULT NULL,
PRIMARY KEY (`record_id`),
KEY `student_id` (`student_id`),
KEY `coach_id` (`coach_id`),
KEY `appointment_id` (`appointment_id`),
CONSTRAINT `training_record_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`),
CONSTRAINT `training_record_ibfk_2` FOREIGN KEY (`coach_id`) REFERENCES `coach` (`coach_id`),
CONSTRAINT `training_record_ibfk_3` FOREIGN KEY (`appointment_id`) REFERENCES `appointment` (`appointment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `training_record`
--
LOCK TABLES `training_record` WRITE;
/*!40000 ALTER TABLE `training_record` DISABLE KEYS */;
INSERT INTO `training_record` VALUES (1,'S001','C001','很好的一次训练!',1),(2,'S002','C002','还需要多加练习。',2),(3,'S003','C003','继续保持进步。',3),(4,'S004','C004','表现不错,加油!',4),(5,'S005','C005','需要改进的地方很多。',5),(6,'S006','C006','进步明显,继续努力。',6),(7,'S007','C007','基础还行,还需加强。',7),(8,'S008','C008','整体不错,细节需注意。',8),(9,'S009','C009','还有提升空间。',9),(10,'S010','C010','做得很好,保持下去。',10);
/*!40000 ALTER TABLE `training_record` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `venue`
--
DROP TABLE IF EXISTS `venue`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `venue` (
`venue_id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`capacity` int NOT NULL,
PRIMARY KEY (`venue_id`),
KEY `idx_venue_name` (`name`),
CONSTRAINT `venue_chk_1` CHECK ((`capacity` > 0))
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `venue`
--
LOCK TABLES `venue` WRITE;
/*!40000 ALTER TABLE `venue` DISABLE KEYS */;
INSERT INTO `venue` VALUES (1,'训练场A',50),(2,'训练场B',30),(3,'理论教室',40),(4,'模拟驾驶室',20),(5,'休息区',60),(6,'户外练习场',70),(7,'室内练习场',55),(8,'考试中心',25),(9,'培训办公室',10),(10,'接待厅',35);
/*!40000 ALTER TABLE `venue` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Dumping routines for database 'DrivingSchool'
--
/*!50003 DROP PROCEDURE IF EXISTS `AddNewStudent` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNewStudent`(
IN p_student_id VARCHAR(255),
IN p_name VARCHAR(255),
IN p_password VARCHAR(255),
IN p_phone VARCHAR(20),
IN p_email VARCHAR(255)
)
BEGIN
DECLARE v_info_id INT;
-- 插入个人基本信息
INSERT INTO personal_info (phone, email) VALUES (p_phone, p_email);
SET v_info_id = LAST_INSERT_ID();
-- 插入学生信息
INSERT INTO student (student_id, name, password, personal_info_id)
VALUES (p_student_id, p_name, p_password, v_info_id);
-- 插入账户信息
INSERT INTO account (account_id, type, status, created_by)
VALUES (p_student_id, '学员', '活跃', '张伟');
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 DROP PROCEDURE IF EXISTS `CalculateCoachTotalIncome` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculateCoachTotalIncome`(
IN p_coach_id VARCHAR(255)
)
BEGIN
SELECT
c.coach_id,
c.name AS coach_name,
SUM(i.amount) AS total_income
FROM
invoice i
JOIN
appointment ap ON i.appointment_id = ap.appointment_id
JOIN
coach c ON ap.coach_id = c.coach_id
WHERE
c.coach_id = p_coach_id
GROUP BY
c.coach_id, c.name;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 DROP PROCEDURE IF EXISTS `DeleteExpiredInvoices` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `DeleteExpiredInvoices`(
IN p_expiry_date DATE
)
BEGIN
DELETE FROM invoice
WHERE date < p_expiry_date;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 DROP PROCEDURE IF EXISTS `GenerateStudentFeedbackReport` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `GenerateStudentFeedbackReport`(
IN p_student_id VARCHAR(255)
)
BEGIN
SELECT
f.feedback_id,
f.content AS feedback_content,
f.date AS feedback_date
FROM
feedback f
JOIN
training_record tr ON f.feedback_id = tr.feedback_id
WHERE
tr.student_id = p_student_id;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 DROP PROCEDURE IF EXISTS `UpdateAppointmentStatus` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateAppointmentStatus`(
IN p_appointment_id INT,
IN p_new_status VARCHAR(50)
)
BEGIN
UPDATE appointment
SET status = p_new_status
WHERE appointment_id = p_appointment_id;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Final view structure for view `appointment_details`
--
/*!50001 DROP VIEW IF EXISTS `appointment_details`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `appointment_details` AS select `ap`.`appointment_id` AS `appointment_id`,`st`.`name` AS `student_name`,`co`.`name` AS `coach_name`,`v`.`name` AS `venue_name`,`ap`.`period` AS `period`,`ap`.`status` AS `status` from (((`appointment` `ap` join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) join `venue` `v` on((`ap`.`venue_id` = `v`.`venue_id`))) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
--
-- Final view structure for view `coach_details`
--
/*!50001 DROP VIEW IF EXISTS `coach_details`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `coach_details` AS select `c`.`coach_id` AS `coach_id`,`c`.`name` AS `coach_name`,`pi`.`phone` AS `phone`,`pi`.`email` AS `email`,`a`.`status` AS `status` from ((`coach` `c` join `personal_info` `pi` on((`c`.`personal_info_id` = `pi`.`info_id`))) join `account` `a` on((`c`.`coach_id` = `a`.`account_id`))) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
--
-- Final view structure for view `invoice_details`
--
/*!50001 DROP VIEW IF EXISTS `invoice_details`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `invoice_details` AS select `i`.`invoice_id` AS `invoice_id`,`i`.`amount` AS `amount`,`i`.`date` AS `invoice_date`,`st`.`name` AS `student_name`,`co`.`name` AS `coach_name` from (((`invoice` `i` join `appointment` `ap` on((`i`.`appointment_id` = `ap`.`appointment_id`))) join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
--
-- Final view structure for view `student_appointment_feedback`
--
/*!50001 DROP VIEW IF EXISTS `student_appointment_feedback`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `student_appointment_feedback` AS select `st`.`name` AS `student_name`,`co`.`name` AS `coach_name`,`ap`.`period` AS `appointment_period`,`ap`.`status` AS `appointment_status`,`f`.`content` AS `feedback_content`,`f`.`date` AS `feedback_date` from (((`appointment` `ap` join `student` `st` on((`ap`.`student_id` = `st`.`student_id`))) join `coach` `co` on((`ap`.`coach_id` = `co`.`coach_id`))) left join `feedback` `f` on((`ap`.`feedback_id` = `f`.`feedback_id`))) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
--
-- Final view structure for view `student_details`
--
/*!50001 DROP VIEW IF EXISTS `student_details`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `student_details` AS select `s`.`student_id` AS `student_id`,`s`.`name` AS `student_name`,`pi`.`phone` AS `phone`,`pi`.`email` AS `email`,`a`.`status` AS `status` from ((`student` `s` join `personal_info` `pi` on((`s`.`personal_info_id` = `pi`.`info_id`))) join `account` `a` on((`s`.`student_id` = `a`.`account_id`))) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-12-25 14:58:02

@ -0,0 +1,142 @@
-- Insert ADMIN data
INSERT INTO ADMIN (admin_name, password) VALUES
('Admin1', 'Password1'),
('Admin2', 'Password2'),
('Admin3', 'Password3'),
('Admin4', 'Password4'),
('Admin5', 'Password5'),
('Admin6', 'Password6'),
('Admin7', 'Password7'),
('Admin8', 'Password8'),
('Admin9', 'Password9'),
('Admin10', 'Password10');
-- Insert ACCOUNT data
INSERT INTO ACCOUNT (type, status) VALUES
('Coach', 'Active'),
('Student', 'Active'),
('Coach', 'Inactive'),
('Student', 'Inactive'),
('Coach', 'Active'),
('Student', 'Active'),
('Coach', 'Active'),
('Student', 'Active'),
('Coach', 'Inactive'),
('Student', 'Inactive');
-- Insert VENUE data
INSERT INTO VENUE (name, capacity) VALUES
('Training Field A', 20),
('Training Field B', 25),
('Theory Classroom 1', 30),
('Theory Classroom 2', 35),
('Rest Room', 15),
('Meeting Room', 10),
('Reception Area', 5),
('Parking Lot', 50),
('Office', 8),
('Storage Room', 10);
-- Insert STUDENT data
INSERT INTO STUDENT (student_id, name, password) VALUES
(1, 'John Doe', 'StudentPass1'),
(2, 'Jane Smith', 'StudentPass2'),
(3, 'Alice Johnson', 'StudentPass3'),
(4, 'Bob Brown', 'StudentPass4'),
(5, 'Charlie Davis', 'StudentPass5'),
(6, 'Diana Evans', 'StudentPass6'),
(7, 'Ethan Foster', 'StudentPass7'),
(8, 'Fiona Gates', 'StudentPass8'),
(9, 'George Hill', 'StudentPass9'),
(10, 'Hannah Irving', 'StudentPass10');
-- Insert COACH data
INSERT INTO COACH (coach_id, name, password) VALUES
(1, 'Mr. Lee', 'CoachPass1'),
(2, 'Mrs. Chen', 'CoachPass2'),
(3, 'Mr. Huang', 'CoachPass3'),
(4, 'Ms. Xu', 'CoachPass4'),
(5, 'Dr. Zhu', 'CoachPass5'),
(6, 'Prof. Jin', 'CoachPass6'),
(7, 'Mr. Lu', 'CoachPass7'),
(8, 'Ms. Liang', 'CoachPass8'),
(9, 'Dr. Shen', 'CoachPass9'),
(10, 'Prof. Han', 'CoachPass10');
-- Insert APPOINTMENT data
INSERT INTO APPOINTMENT (student_id, coach_id, venue_id, period, status) VALUES
(1, 1, 1, 'Morning', 'Scheduled'),
(2, 2, 2, 'Afternoon', 'Completed'),
(3, 3, 1, 'Morning', 'Cancelled'),
(4, 4, 3, 'Evening', 'Pending'),
(5, 5, 4, 'Morning', 'In Progress'),
(6, 6, 5, 'Afternoon', 'Completed'),
(7, 7, 1, 'Morning', 'Scheduled'),
(8, 8, 2, 'Afternoon', 'Completed'),
(9, 9, 3, 'Evening', 'Cancelled'),
(10, 10, 4, 'Morning', 'Pending');
-- Insert FEEDBACK data
INSERT INTO FEEDBACK (content, date) VALUES
('Very satisfied with the teaching method of the coach.', '2023-10-01'),
('Hope for more practical opportunities.', '2023-10-02'),
('The coach patiently answered my questions.', '2023-10-03'),
('Facility conditions need improvement.', '2023-10-04'),
('Teaching content arrangement is reasonable.', '2023-10-05'),
('Suggest adding interactive segments to theory classes.', '2023-10-06'),
('The coach has a good attitude.', '2023-10-07'),
('Facilities are complete.', '2023-10-08'),
('Hope for more course options.', '2023-10-09'),
('Overall experience is good.', '2023-10-10');
-- Insert INVOICE data
INSERT INTO INVOICE (amount, date) VALUES
(500.00, '2023-10-01'),
(600.00, '2023-10-02'),
(550.00, '2023-10-03'),
(700.00, '2023-10-04'),
(650.00, '2023-10-05'),
(500.00, '2023-10-06'),
(600.00, '2023-10-07'),
(550.00, '2023-10-08'),
(700.00, '2023-10-09'),
(650.00, '2023-10-10');
-- Insert PERSONAL_INFO data
INSERT INTO PERSONAL_INFO (student_id, phone, email) VALUES
(1, '13800138000', 'johndoe@example.com'),
(2, '13800138001', 'janesmith@example.com'),
(3, '13800138002', 'alicejohnson@example.com'),
(4, '13800138003', 'bobbrown@example.com'),
(5, '13800138004', 'charliedavis@example.com'),
(6, '13800138005', 'dianaevans@example.com'),
(7, '13800138006', 'ethanfoster@example.com'),
(8, '13800138007', 'fiangates@example.com'),
(9, '13800138008', 'georgehill@example.com'),
(10, '13800138009', 'hannahirving@example.com');
-- Insert TRAINING_RECORD data
INSERT INTO TRAINING_RECORD (student_id, coach_id, feedback) VALUES
(1, 1, 'The coach is very professional and explains clearly.'),
(2, 2, 'Increased my confidence.'),
(3, 3, 'The facility is nice.'),
(4, 4, 'Will come back next time.'),
(5, 5, 'Made significant progress.'),
(6, 6, 'Looking forward to the next session.'),
(7, 7, 'Thank you, coach.'),
(8, 8, 'Learned a lot.'),
(9, 9, 'Keep it up.'),
(10, 10, 'Trustworthy.');
-- Insert BOOKING_SLOT data
INSERT INTO BOOKING_SLOT (start_time, end_time) VALUES
('09:00:00', '10:00:00'),
('10:00:00', '11:00:00'),
('11:00:00', '12:00:00'),
('13:00:00', '14:00:00'),
('14:00:00', '15:00:00'),
('15:00:00', '16:00:00'),
('16:00:00', '17:00:00'),
('17:00:00', '18:00:00'),
('18:00:00', '19:00:00'),
('19:00:00', '20:00:00');

@ -0,0 +1,66 @@
-- 添加新学员的存储过程
CREATE OR REPLACE FUNCTION AddNewStudent(
_student_id VARCHAR(255),
_name VARCHAR(255),
_password VARCHAR(255),
_phone VARCHAR(20),
_email VARCHAR(255)
) RETURNS VOID AS $$
DECLARE
_info_id INT;
BEGIN
INSERT INTO personal_info (phone, email) VALUES (_phone, _email) RETURNING info_id INTO _info_id;
INSERT INTO student (student_id, name, password, personal_info_id) VALUES (_student_id, _name, _password, _info_id);
END;
$$ LANGUAGE plpgsql;
-- 更新教练电话的存储过程
CREATE OR REPLACE FUNCTION UpdateCoachPhone(
_coach_id VARCHAR(255),
_new_phone VARCHAR(20)
) RETURNS VOID AS $$
BEGIN
UPDATE personal_info SET phone = _new_phone WHERE info_id = (SELECT personal_info_id FROM coach WHERE coach_id = _coach_id);
END;
$$ LANGUAGE plpgsql;
-- 获取某个学生的所有预约的存储过程
CREATE OR REPLACE FUNCTION GetStudentAppointments(
_student_id VARCHAR(255)
) RETURNS TABLE(appointment_id INT, coach_name VARCHAR(255), venue_name VARCHAR(255), period VARCHAR(50), status VARCHAR(50)) AS $$
BEGIN
RETURN QUERY
SELECT a.appointment_id, c.name AS coach_name, v.name AS venue_name, a.period, a.status
FROM appointment a
JOIN coach c ON a.coach_id = c.coach_id
JOIN venue v ON a.venue_id = v.venue_id
WHERE a.student_id = _student_id;
END;
$$ LANGUAGE plpgsql;
-- 获取某个教练的所有反馈的存储过程
CREATE OR REPLACE FUNCTION GetCoachFeedbacks(
_coach_id VARCHAR(255)
) RETURNS TABLE(feedback_id INT, content TEXT, date DATE) AS $$
BEGIN
RETURN QUERY
SELECT f.feedback_id, f.content, f.date
FROM feedback f
JOIN training_record t ON f.feedback_id = t.feedback_id
WHERE t.coach_id = _coach_id;
END;
$$ LANGUAGE plpgsql;
-- 获取某个场地的所有可用时间段的存储过程
CREATE OR REPLACE FUNCTION GetAvailableSlotsForVenue(
_venue_id INT
) RETURNS TABLE(slot_id INT, start_time TIME, end_time TIME) AS $$
BEGIN
RETURN QUERY
SELECT bs.slot_id, bs.start_time, bs.end_time
FROM booking_slot bs
LEFT JOIN appointment a ON bs.venue_id = a.venue_id AND bs.start_time <= a.period::time AND bs.end_time >= a.period::time
WHERE bs.venue_id = _venue_id AND a.appointment_id IS NULL;
END;
$$ LANGUAGE plpgsql;

@ -0,0 +1,118 @@
-- 比较条件
-- 查询所有活跃状态的学生
SELECT *
FROM student
WHERE account_id IN (
SELECT account_id
FROM account
WHERE status = '活跃'
);
-- 查询所有非管理员账户
SELECT *
FROM account
WHERE type <> '管理员';
-- 集合比较
-- 查询在多个场地有过预约的学生
SELECT s.student_id, s.name
FROM student s
JOIN appointment a ON s.student_id = a.student_id
GROUP BY s.student_id, s.name
HAVING COUNT(DISTINCT a.venue_id) > 1;
-- 查询同时是教练和学生的人员
SELECT p.info_id, p.phone, p.email
FROM personal_info p
WHERE p.info_id IN (SELECT student_id FROM student)
AND p.info_id IN (SELECT personal_info_id FROM coach);
-- 范围比较
-- 查询2023年10月1日到2023年10月31日期间的反馈
SELECT *
FROM feedback
WHERE date BETWEEN '2023-10-01' AND '2023-10-31';
-- 查询容量大于50的场地
SELECT *
FROM venue
WHERE capacity > 50;
-- 字符串相似比较
-- 查询名字以“张”开头的学生
SELECT *
FROM student
WHERE name LIKE '张%';
-- 查询电子邮件包含“example.com”的个人信息
SELECT *
FROM personal_info
WHERE email LIKE '%example.com%';
-- 多表连接
-- 查询每个学生的最新反馈
SELECT f.feedback_id, f.content, f.date, s.student_id, s.name
FROM feedback f
JOIN training_record tr ON f.feedback_id = tr.feedback_id
JOIN student s ON tr.student_id = s.student_id
WHERE (s.student_id, f.date) IN (
SELECT student_id, MAX(date)
FROM feedback f2
JOIN training_record tr2 ON f2.feedback_id = tr2.feedback_id
GROUP BY student_id
);
-- 查询每个教练负责的所有学生
SELECT c.coach_id, c.name AS coach_name, s.student_id, s.name AS student_name
FROM coach c
JOIN appointment a ON c.coach_id = a.coach_id
JOIN student s ON a.student_id = s.student_id
ORDER BY c.coach_id, s.student_id;
-- 嵌套查询
-- 查询有超过一次预约的学生
SELECT student_id, name
FROM student
WHERE student_id IN (
SELECT student_id
FROM appointment
GROUP BY student_id
HAVING COUNT(*) > 1
);
-- 查询没有任何反馈的预约
SELECT *
FROM appointment
WHERE appointment_id NOT IN (
SELECT appointment_id
FROM feedback
);
-- EXISTS 查询
-- 查询有预约记录的学生
SELECT *
FROM student s
WHERE EXISTS (
SELECT 1
FROM appointment a
WHERE a.student_id = s.student_id
);
-- 查询有训练记录的教练
SELECT *
FROM coach c
WHERE EXISTS (
SELECT 1
FROM training_record tr
WHERE tr.coach_id = c.coach_id
);

@ -0,0 +1,42 @@
-- 创建用户并设置密码
CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'AdminPass';
CREATE USER 'coach_user'@'localhost' IDENTIFIED BY 'CoachPass';
CREATE USER 'student_user'@'localhost' IDENTIFIED BY 'StudentPass';
-- 授予管理员权限
GRANT ALL PRIVILEGES ON fitness_center.* TO 'admin_user'@'localhost';
-- 创建视图供教练使用
CREATE VIEW coach_appointments AS
SELECT * FROM APPOINTMENT WHERE coach_id = SUBSTRING_INDEX(USER(), '@', 1);
CREATE VIEW coach_training_records AS
SELECT * FROM TRAINING_RECORD WHERE coach_id = SUBSTRING_INDEX(USER(), '@', 1);
-- 授予教练权限
GRANT SELECT, INSERT ON fitness_center.FEEDBACK TO 'coach_user'@'localhost';
GRANT SELECT, UPDATE ON fitness_center.coach_appointments TO 'coach_user'@'localhost';
GRANT SELECT ON fitness_center.STUDENT TO 'coach_user'@'localhost';
GRANT SELECT ON fitness_center.coach_training_records TO 'coach_user'@'localhost';
-- 创建视图供学生使用
CREATE VIEW student_appointments AS
SELECT * FROM APPOINTMENT WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1);
CREATE VIEW student_personal_info AS
SELECT * FROM PERSONAL_INFO WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1);
CREATE VIEW student_training_records AS
SELECT * FROM TRAINING_RECORD WHERE student_id = SUBSTRING_INDEX(USER(), '@', 1);
-- 授予学生权限
GRANT SELECT, INSERT ON fitness_center.FEEDBACK TO 'student_user'@'localhost';
GRANT SELECT, UPDATE ON fitness_center.student_appointments TO 'student_user'@'localhost';
GRANT SELECT ON fitness_center.student_personal_info TO 'student_user'@'localhost';
GRANT SELECT ON fitness_center.student_training_records TO 'student_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;

@ -0,0 +1,60 @@
-- 当插入新的学生时自动在personal_info表中插入一条记录
CREATE OR REPLACE FUNCTION InsertPersonalInfoOnStudentInsert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO personal_info (phone, email) VALUES ('', '');
NEW.personal_info_id := currval('personal_info_info_id_seq');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_insert_personal_info_on_student_insert
BEFORE INSERT ON student
FOR EACH ROW EXECUTE FUNCTION InsertPersonalInfoOnStudentInsert();
-- 当删除一个教练时自动删除其关联的personal_info记录
CREATE OR REPLACE FUNCTION DeletePersonalInfoOnCoachDelete()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM personal_info WHERE info_id = OLD.personal_info_id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_personal_info_on_coach_delete
AFTER DELETE ON coach
FOR EACH ROW EXECUTE FUNCTION DeletePersonalInfoOnCoachDelete();
-- 当插入新的预约时,检查是否已经有重叠的时间段
CREATE OR REPLACE FUNCTION CheckOverlapBeforeAppointmentInsert()
RETURNS TRIGGER AS $$
DECLARE
overlap_count INT;
BEGIN
SELECT COUNT(*) INTO overlap_count
FROM appointment a
WHERE a.venue_id = NEW.venue_id
AND ((a.period = NEW.period)
OR (a.period < NEW.period AND a.period + INTERVAL '1 hour' > NEW.period)
OR (a.period > NEW.period AND a.period < NEW.period + INTERVAL '1 hour'));
IF overlap_count > 0 THEN
RAISE EXCEPTION 'There is an overlapping appointment at the same time and place.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_check_overlap_before_appointment_insert
BEFORE INSERT ON appointment
FOR EACH ROW EXECUTE FUNCTION CheckOverlapBeforeAppointmentInsert();
-- 当更新发票金额时,确保金额不小于零
CREATE OR REPLACE FUNCTION EnsureInvoiceAmountNonNegative()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.amount < 0 THEN
RAISE EXCEPTION 'Invoice amount cannot be negative.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

@ -0,0 +1,89 @@
-- 更新学生的电话号码
UPDATE personal_info
SET phone = '13800138001'
WHERE student_id = 'S001';
-- 更新教练的电子邮件
UPDATE personal_info
SET email = 'wangwu_new@example.com'
WHERE info_id = (
SELECT personal_info_id FROM coach WHERE coach_id = 'C001'
);
-- 更新预约的状态
UPDATE appointment
SET status = '已完成'
WHERE appointment_id = 1;
-- 更新场地的容量
UPDATE venue
SET capacity = 60
WHERE venue_id = 1;
-- 更新反馈的内容
UPDATE feedback
SET content = '非常好的一次训练体验!'
WHERE feedback_id = 1;
-- 更新发票的金额
UPDATE invoice
SET amount = 1600.00
WHERE invoice_id = 1;
-- 更新训练记录的反馈内容
UPDATE training_record
SET feedback = '继续保持进步!'
WHERE record_id = 1;
-- 更新账户的状态
UPDATE account
SET status = '停用'
WHERE account_id = 'S001';
-- 更新预约的时间段
UPDATE appointment
SET period = '下午'
WHERE appointment_id = 2;
-- 更新教练的密码
UPDATE coach
SET password = 'newcoachpass2'
WHERE coach_id = 'C002';
-- 删除特定的学生
DELETE FROM student WHERE student_id = 'S007';
DELETE FROM personal_info WHERE student_id = 'S007';
DELETE FROM account WHERE account_id = 'S007';
-- 删除特定的教练
DELETE FROM coach WHERE coach_id = 'C007';
DELETE FROM personal_info WHERE info_id = (
SELECT personal_info_id FROM coach WHERE coach_id = 'C007'
);
DELETE FROM account WHERE account_id = 'C007';
-- 删除特定的预约
DELETE FROM appointment WHERE appointment_id = 3;
-- 删除特定的场地
DELETE FROM venue WHERE venue_id = 6;
-- 删除特定的反馈
DELETE FROM feedback WHERE feedback_id = 5;
-- 删除特定的发票
DELETE FROM invoice WHERE invoice_id = 6;
-- 删除特定的训练记录
DELETE FROM training_record WHERE record_id = 7;
-- 删除特定的账户
DELETE FROM account WHERE account_id = 'S007';
-- 删除特定的预约时间段
DELETE FROM booking_slot WHERE slot_id = 8;
-- 删除特定的个人基本信息
DELETE FROM personal_info WHERE info_id = 7;

@ -0,0 +1,336 @@
import mysql.connector
from mysql.connector import Error
# 数据库配置信息
config = {
'user': 'root',
'password': '123456',
'host': 'localhost',
'database': 'drivingschool',
'raise_on_warnings': True
}
# 连接数据库
def connect_to_db(config):
try:
connection = mysql.connector.connect(**config)
return connection
except Error as e:
print(f"The error '{e}' occurred")
# 断开数据库连接
def close_db_connection(connection):
if connection.is_connected():
connection.close()
# 添加新学生
def add_new_student(connection, student_id, name, password, phone, email):
cursor = connection.cursor()
query = """
CALL AddNewStudent(%s, %s, %s, %s, %s)
"""
cursor.execute(query, (student_id, name, password, phone, email))
connection.commit()
cursor.close()
# 更新预约状态
def update_appointment_status(connection, appointment_id, new_status):
cursor = connection.cursor()
query = """
CALL UpdateAppointmentStatus(%s, %s)
"""
cursor.execute(query, (appointment_id, new_status))
connection.commit()
cursor.close()
# 查询学生详细信息
def get_student_details(connection, student_id):
cursor = connection.cursor()
query = """
SELECT * FROM student_details WHERE student_id = %s
"""
cursor.execute(query, (student_id,))
result = cursor.fetchone()
cursor.close()
return result
# 查询教练详细信息
def get_coach_details(connection, coach_id):
cursor = connection.cursor()
query = """
SELECT * FROM coach_details WHERE coach_id = %s
"""
cursor.execute(query, (coach_id,))
result = cursor.fetchone()
cursor.close()
return result
# 查询预约详细信息
def get_appointment_details(connection, appointment_id):
cursor = connection.cursor()
query = """
SELECT * FROM appointment_details WHERE appointment_id = %s
"""
cursor.execute(query, (appointment_id,))
result = cursor.fetchone()
cursor.close()
return result
# 查询训练记录详细信息
def get_training_record_details(connection, record_id):
cursor = connection.cursor()
query = """
SELECT * FROM training_record_view WHERE record_id = %s
"""
cursor.execute(query, (record_id,))
result = cursor.fetchone()
cursor.close()
return result
# 查询发票详细信息
def get_invoice_details(connection, invoice_id):
cursor = connection.cursor()
query = """
SELECT * FROM invoice_details WHERE invoice_id = %s
"""
cursor.execute(query, (invoice_id,))
result = cursor.fetchone()
cursor.close()
return result
# 查询所有学生详细信息
def get_all_students(connection):
cursor = connection.cursor()
query = """
SELECT * FROM student_details
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有教练详细信息
def get_all_coaches(connection):
cursor = connection.cursor()
query = """
SELECT * FROM coach_details
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有预约详细信息
def get_all_appointments(connection):
cursor = connection.cursor()
query = """
SELECT * FROM appointment_details
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有训练记录详细信息
def get_all_training_records(connection):
cursor = connection.cursor()
query = """
SELECT * FROM training_record_view
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有发票详细信息
def get_all_invoices(connection):
cursor = connection.cursor()
query = """
SELECT * FROM invoice_details
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有反馈
def get_all_feedback(connection):
cursor = connection.cursor()
query = """
SELECT * FROM feedback
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
# 查询所有日志
def get_all_logs(connection):
cursor = connection.cursor()
query = """
SELECT * FROM log
"""
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
return results
def delete_student(connection, student_id):
"""删除学生"""
cursor = connection.cursor()
query = """
DELETE FROM students WHERE student_id = %s
"""
try:
cursor.execute(query, (student_id,))
connection.commit()
print("学生删除成功")
except Error as e:
print(f"删除学生时出错: {e}")
connection.rollback()
finally:
cursor.close()
# 根据用户输入执行不同的操作
def update_student(connection, student_id, name=None, password=None, phone=None, email=None):
"""更新学生信息"""
cursor = connection.cursor()
updates = []
params = [student_id]
if name is not None:
updates.append("name=%s")
params.insert(0, name)
if password is not None:
updates.append("password=%s")
params.insert(1, password)
if phone is not None:
updates.append("phone=%s")
params.insert(2, phone)
if email is not None:
updates.append("email=%s")
params.insert(3, email)
if updates:
query = f"UPDATE students SET {', '.join(updates)} WHERE student_id=%s"
try:
cursor.execute(query, tuple(params))
connection.commit()
print("学生信息更新成功")
except Error as e:
print(f"更新学生信息时出错: {e}")
connection.rollback()
finally:
cursor.close()
else:
print("没有提供要更新的信息")
def main():
connection = connect_to_db(config)
if connection is not None:
while True:
print("\n1. 添加新学生")
print("2. 更新预约状态")
print("3. 查询学生详细信息")
print("4. 查询教练详细信息")
print("5. 查询预约详细信息")
print("6. 查询训练记录详细信息")
print("7. 查询发票详细信息")
print("8. 查询所有学生详细信息")
print("9. 查询所有教练详细信息")
print("10. 查询所有预约详细信息")
print("11. 查询所有训练记录详细信息")
print("12. 查询所有发票详细信息")
print("13. 查询所有反馈")
print("14. 查询所有日志")
print("15. 删除学生")
print("16. 更新学生信息")
print("17. 退出")
choice = input("请选择一个操作:")
if choice == '1':
student_id = input("输入学生ID")
name = input("输入学生姓名:")
password = input("输入学生密码:")
phone = input("输入学生电话:")
email = input("输入学生邮箱:")
add_new_student(connection, student_id, name, password, phone, email)
print("新学生添加成功。")
elif choice == '2':
appointment_id = int(input("输入预约ID"))
new_status = input("输入新的预约状态:")
update_appointment_status(connection, appointment_id, new_status)
print("预约状态更新成功。")
elif choice == '3':
student_id = input("输入学生ID")
details = get_student_details(connection, student_id)
print("学生详细信息:", details)
elif choice == '4':
coach_id = input("输入教练ID")
details = get_coach_details(connection, coach_id)
print("教练详细信息:", details)
elif choice == '5':
appointment_id = int(input("输入预约ID"))
details = get_appointment_details(connection, appointment_id)
print("预约详细信息:", details)
elif choice == '6':
record_id = int(input("输入训练记录ID"))
details = get_training_record_details(connection, record_id)
print("训练记录详细信息:", details)
elif choice == '7':
invoice_id = int(input("输入发票ID"))
details = get_invoice_details(connection, invoice_id)
print("发票详细信息:", details)
elif choice == '8':
all_students = get_all_students(connection)
print("所有学生详细信息:")
for student in all_students:
print(student)
elif choice == '9':
all_coaches = get_all_coaches(connection)
print("所有教练详细信息:")
for coach in all_coaches:
print(coach)
elif choice == '10':
all_appointments = get_all_appointments(connection)
print("所有预约详细信息:")
for appointment in all_appointments:
print(appointment)
elif choice == '11':
all_training_records = get_all_training_records(connection)
print("所有训练记录详细信息:")
for record in all_training_records:
print(record)
elif choice == '12':
all_invoices = get_all_invoices(connection)
print("所有发票详细信息:")
for invoice in all_invoices:
print(invoice)
elif choice == '13':
all_feedback = get_all_feedback(connection)
print("所有反馈:")
for feedback in all_feedback:
print(feedback)
elif choice == '14':
all_logs = get_all_logs(connection)
print("所有日志:")
for log in all_logs:
print(log)
elif choice == '15':
student_id = input("输入要删除的学生ID")
print("删除成功")
elif choice == '16':
student_id = input("输入要更新的学生ID")
name = input("输入新的学生姓名 (留空则不更改): ") or None
password = input("输入新的学生密码 (留空则不更改): ") or None
phone = input("输入新的学生电话 (留空则不更改): ") or None
email = input("输入新的学生邮箱 (留空则不更改): ") or None
print("学生信息已更新")
elif choice == '17':
break
else:
print("无效的选择,请重新输入。")
close_db_connection(connection)
close_db_connection(connection)
if __name__ == "__main__":
main()
Loading…
Cancel
Save