CREATE DATABASE IF NOT EXISTS `schedule_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `schedule_db`;
CREATE TABLE IF NOT EXISTS `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fullname` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `employee_status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`employee_id` int(11) NOT NULL,
`start_date` date NOT NULL,
`end_date` date NOT NULL,
`status_type` enum('vacation','sick_leave') NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`created_by` int(11) DEFAULT NULL COMMENT 'ID пользователя, установившего статус',
PRIMARY KEY (`id`),
KEY `date_range` (`start_date`,`end_date`),
KEY `employee_dates` (`employee_id`,`start_date`,`end_date`),
CONSTRAINT `employee_status_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DELIMITER $$
CREATE TRIGGER IF NOT EXISTS `check_status_overlap` BEFORE INSERT ON `employee_status` FOR EACH ROW BEGIN
IF EXISTS (
SELECT 1 FROM employee_status
WHERE employee_id = NEW.employee_id
AND NEW.start_date <= end_date
AND NEW.end_date >= start_date
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Новый статус пересекается с существующим периодом';
END IF;
END$$
DELIMITER ;
CREATE TABLE IF NOT EXISTS `shifts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`employee_id` int(11) NOT NULL,
`shift_date` date NOT NULL,
`shift_type` enum('day','night','off') NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `employee_date` (`employee_id`,`shift_date`),
CONSTRAINT `shifts_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Первый раз здесь писал, на будущее учту