Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Мне нужно создать триггер в mysql, который бы при добавлении в таблицу "Пассажиры" нового пассажира проверял, есть ли места на нужный ему рейс.
Две таблицы: "Пассажиры"(id_passenger,FIO,passport_nuber, passport_series,gender, flight, reservation quantity)
"Рейс"(number_flight,route,departure_date,plane,capacity,free_space)

CREATE DEFINER = CURRENT_USER TRIGGER passenger_BEFORE_INSERT BEFORE INSERT ON `passenger` FOR INSERT AS
BEGIN
BEGIN
IF (SELECT free_space FROM flight WHERE flight.number_flight=NEW.passenger.flight) = 0
BEGIN
SELECT CONCAT('Test output')
END;
ELSE
BEGIN
UPDATE flight
SET free_spase=free_spase-NEW.passenger.reservation_quantity
END;
END;
END

Он не работает и я не понимаю почему. Это мой второй триггер. Буду очень благодарна за помощь)

Сообщение было отредактировано: 17 ноя 20, 18:19
17 ноя 20, 18:23    [22234054]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Aklin
Member

Откуда: Прямо сейчас меня здесь нет
Сообщений: 60389
Что именно не получается?

Пособие для студентов и школьников
17 ноя 20, 20:10    [22234139]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
ashlidepp
Он не работает и я не понимаю почему.

Не работают - афроамериканцы в Африке. А триггер не может НЕ работать. Он может работать не так, как Вы ожидаете. При условии, что он вообще был создан.

При первом взгляде на него сразу видно, что Вы выполняете в нём SELECT в выходной поток, что в триггерах недопустимо. Теоретически он вообще не должен был создаться. Дальше даже не смотрел.
18 ноя 20, 07:32    [22234335]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Akina, а как тогда узнать количество свободных мест нужного мне рейса? что нужно использовать? или в принципе я неправильно выстроила логику триггера? подскажите, пожалуйста, что не так
19 ноя 20, 21:00    [22235713]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29362
ashlidepp,

1. space и spase как бы не одно и то же.
2. по уму проверку на 0 свободных мест и выдавать exception должен триггер на update на таблице flight. Так что триггер на passenger тут нафиг не нужен.
3. запрос
UPDATE flight
SET free_spase=free_spase-NEW.passenger.reservation_quantity
великолепен. WHERE у него где? Обновляет напрочь всю таблицу flight?
19 ноя 20, 21:20    [22235729]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
kdv,
1. это помарка(правильно space)
2. а можно более подробнее дать объяснения? прям "разжевать" и без злобного надменного тона (если вас конечно не затруднит)?
19 ноя 20, 22:11    [22235757]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
kdv,запрос сам верный? нужно добавить WHERE flight.number_flight=NEW.passenger.flight?
19 ноя 20, 22:14    [22235760]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Aklin, как можно реализовать проверку свободных мест без использования запроса SELECT?
19 ноя 20, 22:37    [22235773]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
kdv, триггер должен срабатывать до вставки нового пассажира в таблицу "пассажир". если мест нет-вставки нового пассажира не должно происходить. если места есть, то он должен в таблице "рейс" в столбце "free_space" вычесть из старого значения количество броней нового пассажира ("reservation quantity")
при чем здесь "триггер на update на таблице flight"?
19 ноя 20, 22:47    [22235779]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
ashlidepp
как тогда узнать количество свободных мест нужного мне рейса?

SELECT, но выполняемый в переменную (лучше локальную), а не в выходной поток.

ashlidepp
если места есть, то он должен в таблице "рейс" в столбце "free_space" вычесть из старого значения количество броней нового пассажира ("reservation quantity")

Оглянись - ты на поле с граблями.
Никакого free_space не должно быть в принципе. Количество пассажиров, уже зарезервировавших места, считается запросом по passenger. Количество мест берётся из flight. Наличие свободных мест определяется сравнением этих двух величин.
20 ноя 20, 07:24    [22235845]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Akina,
CREATE TRIGGER passenger_before_insert BEFORE INSERT ON passenger FOR INSERT AS
BEGIN
SET @a=(SELECT SUM(reservation_quantity) FROM passenger WHERE passenger.flight=NEW.passenger.flight)
IF @a<capacity AND @a+NEW.reservation_quantity<=capacity
THEN INSERT INTO passenger (id_passenger, FIO, passport_number, passport_series, gender, flight, reservation_quantity)
VALUE (NEW.id_passenger, NEW.FIO, NEW.passport_number, NEW.passport_series, NEW.gender, NEW.flight, NEW.reservation_quantity);
ELSE
SELECT CONCAT('Мест нет')
END;

так?
20 ноя 20, 10:44    [22235897]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Не так.

Во-первых, пора бы уже найти кнопку SRC и научиться обрамлять код соответствующим тегом, а не постить его текстовой лапшой. Ну и предварительный просмотр использовать, дабы убедиться, что форматирование не кривое.

Во-вторых, я уже говорил - в триггере НИЧЕГО нельзя отправлять в выходной поток... так какой нафиг SELECT CONCAT('Мест нет')?

В третьих, для сравнения никаких промежуточных переменных не требуется, результаты двух подзапросов, каждый из которых возвращает одну запись из одного поля, можно сравнивать напрямую.

А теперь, внимание, вопрос. А какая у нас собственно СУБД? уж и не спрашиваю про версию и про то, по какой причине тема создана не в разделе по конкретной СУБД ...
20 ноя 20, 11:04    [22235907]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Akina, MySQL,версия 8.0, я здесь первый раз, уж простите тема создана не в разделе по конкретной СУБД
как тогда правильно вывести сообщение? в интернете я не нашла нормальных примеров вывода текста
20 ноя 20, 11:58    [22235951]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
ashlidepp
MySQL,версия 8.0


CREATE TRIGGER passenger_before_insert 
BEFORE INSERT 
ON passenger 
FOR EACH ROW
BEGIN
IF ( SELECT SUM(reservation_quantity) + NEW.reservation_quantity
     FROM passenger 
     WHERE flight=NEW.flight ) >= ( SELECT free_space 
                                    FROM flight 
                                    WHERE number_flight=NEW.flight ) THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'На этот рейс такого количества свободных мест нет.';
END IF;
END


Предполагается, что в passenger в одной записи может быть зарезервировано более 1 места.

[DEMO fiddle]
20 ноя 20, 12:42    [22235978]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
ashlidepp
Member

Откуда:
Сообщений: 9
Akina,спасибо большое)
20 ноя 20, 13:17    [22235999]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51774
ashlidepp,

главное никогда не запускай это в продакшен. Сдала зачёт - тут же забудь.
20 ноя 20, 14:51    [22236071]     Ответить | Цитировать Сообщить модератору
 Re: Триггер проверяющий наличие мест на рейсе и добавляющий пассажиров  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Dimitry Sibiryakov,

+100500
20 ноя 20, 15:14    [22236081]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить