#mysql
#mysql
Вопрос:
Я хочу создать триггер, который ограничит время аренды автомобиля 7 днями. Так, например… Вы можете арендовать автомобиль с 01/01/2019 по 06/01/2019, НО вы НЕ МОЖЕТЕ арендовать автомобиль с 01/01/2019 по 10/01/2019. Использовать ли мне BEFORE INSERT? Любая помощь приветствуется.
Я также прилагаю свою таблицу бронирований для некоторой ясности.
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (1, '2019/02/26', '2019/02/28', '2019/03/01', 1, 1, 1, 1, 'Yes', 'Be a bit early');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (2, '2019/02/28', '2019/02/28', '2019/03/03', 2, NULL, 2, 2, 'No','Please have some water');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (3, '2019/03/01', '2019/03/02', '2019/03/05', 3, NULL, 3, 3, 'No','Drive slow, children in the car');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (4, '2019/03/04', '2019/03/06', '2019/03/10', 4, 4, 4, 4, 'Yes','Please be silent while driving');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (5, '2019/03/08', '2019/03/09', '2019/03/13', 5, NULL, 5, 5, 'No','Need to be exactly on time');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (6, '2019/04/03', '2019/04/04', '2019/04/06', 6, 6, 6, 6, 'Yes','Children onboard, please drive slow');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (7, '2019/04/05', '2019/04/07', '2019/03/10', 7, NULL, 7, 7, 'No','Arrive 5 minutes early');
Комментарии:
1. Я бы подумал о том, чтобы сделать это во внешнем интерфейсе, а не в триггере.
2. Я не занимаюсь этим, поскольку мы не будем этого делать. поэтому мне нужно сделать это в SQL. Это часть проекта.
Ответ №1:
Мы могли бы выполнить эту проверку в BEFORE INSERT
триггере и вызвать условие ошибки, чтобы предотвратить выполнение предыдущего оператора. Для полноты картины нам, вероятно, также понадобится BEFORE UPDATE
триггер (чтобы предотвратить изменение строки, уже вставленной в bookings
, на срок более недели.)
Что-то вроде этого для начала:
DELIMITER $$
CREATE TRIGGER `trg_bookings_bi`
BEFORE INSERT ON `bookings`
FOR EACH ROW
BEGIN
IF ( NEW.end_date > NEW.start_date INTERVAL 7 DAY ) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'error end_date more than seven days after start_date';
END IF;
END$$
DELIMITER ;
Комментарии:
1. Спасибо за ваш вклад. Говоря «для начала», я бы предположил, что можно расширить этот триггер?
2. Эта версия MySQL пока не поддерживает «несколько триггеров с одинаковым временем действия и событием для одной таблицы» — у меня уже есть триггер ПЕРЕД ВСТАВКОЙ В бронирования. Влияет ли это на это
3. Вы могли бы добавить его к существующему триггеру, просто будьте осторожны с обработкой ошибок, чтобы убедиться, что он выполняет то, что вы хотите.