Search
Write a publication
Pull to refresh
1
-7
Евгений @Merehim

User

Send message
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;

Первый раз здесь писал, на будущее учту

Information

Rating
Does not participate
Location
Ростов-на-Дону, Ростовская обл., Россия
Date of birth
Registered
Activity