You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

695 lines
30 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
Navicat Premium Dump SQL
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 90001 (9.0.1)
Source Host : localhost:3306
Source Schema : pharmacy
Target Server Type : MySQL
Target Server Version : 90001 (9.0.1)
File Encoding : 65001
Date: 02/01/2025 19:26:12
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for address
-- ----------------------------
DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '收货地址唯一标识,自增长主键',
`patient_id` int NOT NULL COMMENT '关联的患者的唯一标识',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收件人姓名',
`province` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所在省份',
`city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所在城市',
`district` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所在区县',
`detailed_address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '详细地址信息',
PRIMARY KEY (`id`) USING BTREE,
INDEX `patient_id`(`patient_id` ASC) USING BTREE,
CONSTRAINT `address_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收货地址表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for address_log
-- ----------------------------
DROP TABLE IF EXISTS `address_log`;
CREATE TABLE `address_log` (
`log_id` int NOT NULL AUTO_INCREMENT,
`address_id` int NOT NULL,
`operation_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`operation_time` datetime NOT NULL,
PRIMARY KEY (`log_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for disease
-- ----------------------------
DROP TABLE IF EXISTS `disease`;
CREATE TABLE `disease` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '疾病唯一标识,自增长主键',
`patient_id` int NOT NULL COMMENT '对应患者id',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '疾病名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '疾病信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for disease_insert_log
-- ----------------------------
DROP TABLE IF EXISTS `disease_insert_log`;
CREATE TABLE `disease_insert_log` (
`log_id` int NOT NULL AUTO_INCREMENT,
`disease_id` int NOT NULL,
`insert_time` datetime NOT NULL,
PRIMARY KEY (`log_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '员工唯一标识,自增长主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '员工姓名',
`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '员工职称',
`gender` enum('','') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工性别',
`age` int NULL DEFAULT NULL COMMENT '员工年龄',
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`id_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`status` int NULL DEFAULT 1,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_username`(`username` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 85 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '员工信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for information
-- ----------------------------
DROP TABLE IF EXISTS `information`;
CREATE TABLE `information` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '联系方式唯一标识,自增长主键',
`patient_id` int NOT NULL COMMENT '关联的患者的唯一标识',
`type` int NOT NULL COMMENT '联系方式类型0手机、1邮箱',
`phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '电话号码',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '电子邮箱地址',
PRIMARY KEY (`id`) USING BTREE,
INDEX `patient_id`(`patient_id` ASC) USING BTREE,
CONSTRAINT `information_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '联系方式表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for information_log
-- ----------------------------
DROP TABLE IF EXISTS `information_log`;
CREATE TABLE `information_log` (
`log_id` int NOT NULL AUTO_INCREMENT,
`information_id` int NOT NULL,
`operation_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`operation_time` datetime NOT NULL,
PRIMARY KEY (`log_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for medicine
-- ----------------------------
DROP TABLE IF EXISTS `medicine`;
CREATE TABLE `medicine` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '药品唯一标识,自增长主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '药品名称',
`dosage_form` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '药品剂型,例如片剂、胶囊等',
`specification` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '药品规格',
`expiration_date` date NOT NULL COMMENT '药品有效期截止日期',
`stock_quantity` int NOT NULL COMMENT '药品库存数量',
`purchase_price` decimal(10, 2) NOT NULL COMMENT '药品进货价格',
`retail_price` decimal(10, 2) NOT NULL COMMENT '药品零售价格',
`status` int NOT NULL DEFAULT 1,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '药品信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for order
-- ----------------------------
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '订单唯一标识,自增长主键',
`order_time` datetime NOT NULL COMMENT '下单时间',
`patient_id` int NOT NULL COMMENT '下单患者的唯一标识',
`employee_id` int NOT NULL COMMENT '处理该订单的员工的唯一标识',
`total_amount` decimal(10, 2) NOT NULL COMMENT '订单总金额',
`order_status` int NOT NULL DEFAULT 1 COMMENT '订单当前状态未完成1已完成2取消3',
PRIMARY KEY (`id`) USING BTREE,
INDEX `patient_id`(`patient_id` ASC) USING BTREE,
INDEX `employee_id`(`employee_id` ASC) USING BTREE,
CONSTRAINT `order_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `order_ibfk_2` FOREIGN KEY (`employee_id`) REFERENCES `employee` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for order_medicine_relation
-- ----------------------------
DROP TABLE IF EXISTS `order_medicine_relation`;
CREATE TABLE `order_medicine_relation` (
`order_id` int NOT NULL COMMENT '关联的订单的唯一标识',
`medicine_id` int NOT NULL COMMENT '关联的药品的唯一标识',
`quantity` int NOT NULL COMMENT '该药品在对应订单中的数量',
PRIMARY KEY (`order_id`, `medicine_id`) USING BTREE,
INDEX `medicine_id`(`medicine_id` ASC) USING BTREE,
CONSTRAINT `order_medicine_relation_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `order_medicine_relation_ibfk_2` FOREIGN KEY (`medicine_id`) REFERENCES `medicine` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单药品关联表,用于体现订单与药品之间多对多的关联关系以及对应的数量信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for patient
-- ----------------------------
DROP TABLE IF EXISTS `patient`;
CREATE TABLE `patient` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '患者唯一标识,自增长主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '患者姓名',
`gender` enum('','') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '患者性别',
`age` int NULL DEFAULT NULL COMMENT '患者年龄',
`id_card_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '患者身份证号码',
`status` int NULL DEFAULT 1,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '患者信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for promotion_activitie
-- ----------------------------
DROP TABLE IF EXISTS `promotion_activitie`;
CREATE TABLE `promotion_activitie` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '促销活动唯一标识,自增长主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '促销活动名称',
`start_time` datetime NOT NULL COMMENT '促销活动开始时间',
`end_time` datetime NOT NULL COMMENT '促销活动结束时间',
`preferential_rules` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '促销活动的优惠规则内容',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '促销活动表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for promotion_medicine_relation
-- ----------------------------
DROP TABLE IF EXISTS `promotion_medicine_relation`;
CREATE TABLE `promotion_medicine_relation` (
`promotion_id` int NOT NULL COMMENT '关联的促销活动的唯一标识',
`medicine_id` int NOT NULL COMMENT '关联的药品的唯一标识',
PRIMARY KEY (`promotion_id`, `medicine_id`) USING BTREE,
INDEX `medicine_id`(`medicine_id` ASC) USING BTREE,
CONSTRAINT `promotion_medicine_relation_ibfk_1` FOREIGN KEY (`promotion_id`) REFERENCES `promotion_activitie` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `promotion_medicine_relation_ibfk_2` FOREIGN KEY (`medicine_id`) REFERENCES `medicine` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '促销药品关联表,用于体现促销活动与药品之间多对多的关联关系' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Triggers structure for table address
-- ----------------------------
DROP TRIGGER IF EXISTS `check_patient_exists_before_insert_address`;
delimiter ;;
CREATE TRIGGER `check_patient_exists_before_insert_address` BEFORE INSERT ON `address` FOR EACH ROW BEGIN
DECLARE patient_count INT;
SELECT COUNT(*) INTO patient_count FROM `patient` WHERE `id` = NEW.patient_id;
IF patient_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入收货地址记录时,对应的患者不存在,请检查 patient_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table address
-- ----------------------------
DROP TRIGGER IF EXISTS `log_address_insert`;
delimiter ;;
CREATE TRIGGER `log_address_insert` AFTER INSERT ON `address` FOR EACH ROW BEGIN
INSERT INTO `address_log` (`address_id`, `operation_type`, `operation_time`)
VALUES (NEW.id, 'INSERT', NOW());
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table address
-- ----------------------------
DROP TRIGGER IF EXISTS `check_new_patient_exists_before_update_address`;
delimiter ;;
CREATE TRIGGER `check_new_patient_exists_before_update_address` BEFORE UPDATE ON `address` FOR EACH ROW BEGIN
DECLARE patient_count INT;
SELECT COUNT(*) INTO patient_count FROM `patient` WHERE `id` = NEW.patient_id;
IF patient_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '更新收货地址记录关联的患者时,新的患者不存在,请检查 patient_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table disease
-- ----------------------------
DROP TRIGGER IF EXISTS `log_disease_insert`;
delimiter ;;
CREATE TRIGGER `log_disease_insert` AFTER INSERT ON `disease` FOR EACH ROW BEGIN
INSERT INTO `disease_insert_log` (`disease_id`, `insert_time`)
VALUES (NEW.id, NOW());
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table employee
-- ----------------------------
DROP TRIGGER IF EXISTS `check_age_before_insert`;
delimiter ;;
CREATE TRIGGER `check_age_before_insert` BEFORE INSERT ON `employee` FOR EACH ROW BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄必须在0到120岁之间';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table employee
-- ----------------------------
DROP TRIGGER IF EXISTS `check_phone_before_insert`;
delimiter ;;
CREATE TRIGGER `check_phone_before_insert` BEFORE INSERT ON `employee` FOR EACH ROW BEGIN
IF NOT NEW.phone REGEXP '^[0-9]{11}$' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '手机号码格式不正确';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table employee
-- ----------------------------
DROP TRIGGER IF EXISTS `check_age_before_insert_employee`;
delimiter ;;
CREATE TRIGGER `check_age_before_insert_employee` BEFORE INSERT ON `employee` FOR EACH ROW BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄必须在0到120岁之间';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table employee
-- ----------------------------
DROP TRIGGER IF EXISTS `check_age_before_update`;
delimiter ;;
CREATE TRIGGER `check_age_before_update` BEFORE UPDATE ON `employee` FOR EACH ROW BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄必须在0到120岁之间';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table information
-- ----------------------------
DROP TRIGGER IF EXISTS `check_patient_exists_before_insert_information`;
delimiter ;;
CREATE TRIGGER `check_patient_exists_before_insert_information` BEFORE INSERT ON `information` FOR EACH ROW BEGIN
DECLARE patient_count INT;
SELECT COUNT(*) INTO patient_count FROM `patient` WHERE `id` = NEW.patient_id;
IF patient_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入联系方式记录时,对应的患者不存在,请检查 patient_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table information
-- ----------------------------
DROP TRIGGER IF EXISTS `log_information_insert`;
delimiter ;;
CREATE TRIGGER `log_information_insert` AFTER INSERT ON `information` FOR EACH ROW BEGIN
INSERT INTO `information_log` (`information_id`, `operation_type`, `operation_time`)
VALUES (NEW.id, 'INSERT', NOW());
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table information
-- ----------------------------
DROP TRIGGER IF EXISTS `check_new_patient_exists_before_update_information`;
delimiter ;;
CREATE TRIGGER `check_new_patient_exists_before_update_information` BEFORE UPDATE ON `information` FOR EACH ROW BEGIN
DECLARE patient_count INT;
SELECT COUNT(*) INTO patient_count FROM `patient` WHERE `id` = NEW.patient_id;
IF patient_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '更新联系方式记录关联的患者时,新的患者不存在,请检查 patient_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `check_expiration_date_before_insert_medicine`;
delimiter ;;
CREATE TRIGGER `check_expiration_date_before_insert_medicine` BEFORE INSERT ON `medicine` FOR EACH ROW BEGIN
IF NEW.expiration_date < CURDATE() THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '药品有效期截止日期不能早于当前日期,请重新填写!';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `convert_name_to_uppercase_before_insert_medicine`;
delimiter ;;
CREATE TRIGGER `convert_name_to_uppercase_before_insert_medicine` BEFORE INSERT ON `medicine` FOR EACH ROW BEGIN
SET NEW.name = UPPER(NEW.name);
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `check_stock_quantity_before_update_medicine`;
delimiter ;;
CREATE TRIGGER `check_stock_quantity_before_update_medicine` BEFORE UPDATE ON `medicine` FOR EACH ROW BEGIN
IF NEW.stock_quantity < 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '药品库存数量不能小于0请重新设置库存数量';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `check_retail_price_before_update_medicine`;
delimiter ;;
CREATE TRIGGER `check_retail_price_before_update_medicine` BEFORE UPDATE ON `medicine` FOR EACH ROW BEGIN
IF NEW.retail_price < NEW.purchase_price THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '药品零售价格不能低于进货价格,请重新设置零售价格!';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `convert_name_to_uppercase_before_update_medicine`;
delimiter ;;
CREATE TRIGGER `convert_name_to_uppercase_before_update_medicine` BEFORE UPDATE ON `medicine` FOR EACH ROW BEGIN
SET NEW.name = UPPER(NEW.name);
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table medicine
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_relation_on_medicine_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_relation_on_medicine_delete` AFTER DELETE ON `medicine` FOR EACH ROW BEGIN
DELETE FROM `order_medicine_relation` WHERE `medicine_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order
-- ----------------------------
DROP TRIGGER IF EXISTS `check_patient_employee_exists_before_insert_order`;
delimiter ;;
CREATE TRIGGER `check_patient_employee_exists_before_insert_order` BEFORE INSERT ON `order` FOR EACH ROW BEGIN
DECLARE patient_count INT;
DECLARE employee_count INT;
-- 检查患者是否存在
SELECT COUNT(*) INTO patient_count FROM `patient` WHERE `id` = NEW.patient_id;
IF patient_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入订单记录时,对应的患者不存在,请检查 patient_id';
END IF;
-- 检查员工是否存在
SELECT COUNT(*) INTO employee_count FROM `employee` WHERE `id` = NEW.employee_id;
IF employee_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入订单记录时,对应的员工不存在,请检查 employee_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order
-- ----------------------------
DROP TRIGGER IF EXISTS `set_default_order_status_before_insert_order`;
delimiter ;;
CREATE TRIGGER `set_default_order_status_before_insert_order` BEFORE INSERT ON `order` FOR EACH ROW BEGIN
IF NEW.total_amount > 1000 THEN
SET NEW.order_status = 2;
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order
-- ----------------------------
DROP TRIGGER IF EXISTS `check_order_status_before_update_order`;
delimiter ;;
CREATE TRIGGER `check_order_status_before_update_order` BEFORE UPDATE ON `order` FOR EACH ROW BEGIN
IF NEW.order_status NOT IN (1, 2, 3) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '订单状态值只能为1未完成、2已完成或3取消请重新设置';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_relation_on_order_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_relation_on_order_delete` AFTER DELETE ON `order` FOR EACH ROW BEGIN
DELETE FROM `order_medicine_relation` WHERE `order_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order_medicine_relation
-- ----------------------------
DROP TRIGGER IF EXISTS `check_order_medicine_exists_before_insert_relation`;
delimiter ;;
CREATE TRIGGER `check_order_medicine_exists_before_insert_relation` BEFORE INSERT ON `order_medicine_relation` FOR EACH ROW BEGIN
DECLARE order_count INT;
DECLARE medicine_count INT;
-- 检查订单是否存在
SELECT COUNT(*) INTO order_count FROM `order` WHERE `id` = NEW.order_id;
IF order_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入订单药品关联记录时,对应的订单不存在,请检查 order_id';
END IF;
-- 检查药品是否存在
SELECT COUNT(*) INTO medicine_count FROM `medicine` WHERE `id` = NEW.medicine_id;
IF medicine_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入订单药品关联记录时,对应的药品不存在,请检查 medicine_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table order_medicine_relation
-- ----------------------------
DROP TRIGGER IF EXISTS `check_quantity_before_update_relation`;
delimiter ;;
CREATE TRIGGER `check_quantity_before_update_relation` BEFORE UPDATE ON `order_medicine_relation` FOR EACH ROW BEGIN
IF NEW.quantity < 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '订单中药品的数量不能小于0请重新设置数量';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `check_age_before_insert_patient`;
delimiter ;;
CREATE TRIGGER `check_age_before_insert_patient` BEFORE INSERT ON `patient` FOR EACH ROW BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄必须在0到120岁之间';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `check_id_card_number_before_insert_patient`;
delimiter ;;
CREATE TRIGGER `check_id_card_number_before_insert_patient` BEFORE INSERT ON `patient` FOR EACH ROW BEGIN
IF CHAR_LENGTH(NEW.id_card_number) <> 18 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '身份证号码格式不正确';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `check_age_before_update_patient`;
delimiter ;;
CREATE TRIGGER `check_age_before_update_patient` BEFORE UPDATE ON `patient` FOR EACH ROW BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄必须在0到120岁之间';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_disease_on_patient_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_disease_on_patient_delete` AFTER DELETE ON `patient` FOR EACH ROW BEGIN
DELETE FROM `disease` WHERE `patient_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_address_on_patient_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_address_on_patient_delete` AFTER DELETE ON `patient` FOR EACH ROW BEGIN
DELETE FROM `address` WHERE `patient_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table patient
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_information_on_patient_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_information_on_patient_delete` AFTER DELETE ON `patient` FOR EACH ROW BEGIN
DELETE FROM `information` WHERE `patient_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_activitie
-- ----------------------------
DROP TRIGGER IF EXISTS `check_time_order_before_insert_promotion`;
delimiter ;;
CREATE TRIGGER `check_time_order_before_insert_promotion` BEFORE INSERT ON `promotion_activitie` FOR EACH ROW BEGIN
IF NEW.start_time >= NEW.end_time THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '促销活动开始时间必须早于结束时间,请重新设置时间!';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_activitie
-- ----------------------------
DROP TRIGGER IF EXISTS `convert_name_to_uppercase_before_insert_promotion`;
delimiter ;;
CREATE TRIGGER `convert_name_to_uppercase_before_insert_promotion` BEFORE INSERT ON `promotion_activitie` FOR EACH ROW BEGIN
SET NEW.name = UPPER(NEW.name);
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_activitie
-- ----------------------------
DROP TRIGGER IF EXISTS `check_time_order_before_update_promotion`;
delimiter ;;
CREATE TRIGGER `check_time_order_before_update_promotion` BEFORE UPDATE ON `promotion_activitie` FOR EACH ROW BEGIN
IF NEW.start_time >= NEW.end_time THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '促销活动开始时间必须早于结束时间,请重新设置时间!';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_activitie
-- ----------------------------
DROP TRIGGER IF EXISTS `convert_name_to_uppercase_before_update_promotion`;
delimiter ;;
CREATE TRIGGER `convert_name_to_uppercase_before_update_promotion` BEFORE UPDATE ON `promotion_activitie` FOR EACH ROW BEGIN
SET NEW.name = UPPER(NEW.name);
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_activitie
-- ----------------------------
DROP TRIGGER IF EXISTS `cascade_delete_relation_on_promotion_delete`;
delimiter ;;
CREATE TRIGGER `cascade_delete_relation_on_promotion_delete` AFTER DELETE ON `promotion_activitie` FOR EACH ROW BEGIN
DELETE FROM `promotion_medicine_relation` WHERE `promotion_id` = OLD.id;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_medicine_relation
-- ----------------------------
DROP TRIGGER IF EXISTS `check_promotion_medicine_exists_before_insert_relation`;
delimiter ;;
CREATE TRIGGER `check_promotion_medicine_exists_before_insert_relation` BEFORE INSERT ON `promotion_medicine_relation` FOR EACH ROW BEGIN
DECLARE promotion_count INT;
DECLARE medicine_count INT;
-- 检查促销活动是否存在
SELECT COUNT(*) INTO promotion_count FROM `promotion_activitie` WHERE `id` = NEW.promotion_id;
IF promotion_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入促销药品关联记录时,对应的促销活动不存在,请检查 promotion_id';
END IF;
-- 检查药品是否存在
SELECT COUNT(*) INTO medicine_count FROM `medicine` WHERE `id` = NEW.medicine_id;
IF medicine_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入促销药品关联记录时,对应的药品不存在,请检查 medicine_id';
END IF;
END
;;
delimiter ;
-- ----------------------------
-- Triggers structure for table promotion_medicine_relation
-- ----------------------------
DROP TRIGGER IF EXISTS `prevent_duplicate_relation_insert`;
delimiter ;;
CREATE TRIGGER `prevent_duplicate_relation_insert` BEFORE INSERT ON `promotion_medicine_relation` FOR EACH ROW BEGIN
SET @count = (SELECT COUNT(*) FROM `promotion_medicine_relation`
WHERE `promotion_id` = NEW.promotion_id
AND `medicine_id` = NEW.medicine_id);
IF @count > 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '该促销活动已关联此药品,请勿重复关联!';
END IF;
END
;;
delimiter ;
SET FOREIGN_KEY_CHECKS = 1;