Как создать триггер, который заполнял бы поле значением с другой таблицы?

Столкнулся с такой проблемой. Мне нужно реализовать триггер, который смог бы

вставлять значение с другой таблицы при вставке. То есть писав

insert into table(column1, column2) values (1,'hello'),(2,'world');

в column 3 заполнялось значением с другой таблицы при условии что column2='Первый'. Сами по себе первая таблица связана со второй по внешнему ключу.

CREATE TABLE `price` (
    `nomer_flight_price` int NOT NULL,
    `1st_class_cost` DECIMAL(10,2) NOT NULL,
    `business_class_cost` DECIMAL(10,2) NOT NULL,
    `economy_class_cost` DECIMAL(10,2) NOT NULL,
    PRIMARY KEY (`nomer_flight_price`)
);

CREATE TABLE `ticket` (
    `nomer_flight` int NOT NULL,
    `departure_date` DATETIME NOT NULL,
    `class` varchar(15) NOT NULL,
    `price` DECIMAL(10,2) NOT NULL,
    `discounts` DECIMAL(3,1) NOT NULL,
    `taxes` DECIMAL(3,1) NOT NULL,
    `agency_fee` DECIMAL(3,1) NOT NULL,
    `baggage_allowance` varchar(10) NOT NULL,
    `nomer_ticket` int NOT NULL,
    PRIMARY KEY (`nomer_ticket`)
);

ALTER TABLE `ticket` ADD CONSTRAINT `ticket_fk0` FOREIGN KEY (`nomer_flight`) REFERENCES `price`(`nomer_flight_price`);

Триггер нужен для таблицы ticket. Так же вот моя попытка написать данный триггер, да я там ошибся кое-где.

create trigger trigger_name
     before insert
     on ticket
     for each row
     begin
     if (select price.1st_class_cost from price where price.nomer_flight_price=new.nomer_flight)='Первый' THEN
     insert into ticket (price) values (price.1st_class_cost);
     elseif (select price.business_class_cost from price where price.nomer_flight_price=new.nomer_flight)='Бизнес' THEN
     insert into ticket (price) values (price.business_class_cost);
     elseif (select price.economy_class_cost from price where price.nomer_flight_price=new.nomer_flight)='Эконом' THEN
     insert into ticket (price) values (price.economy_class_cost);
     end if;
     end;

Ответы (1 шт):

Автор решения: Akina

Шаблон:

CREATE TRIGGER trigger_name
BEFORE INSERT ON ticket
FOR EACH ROW
BEGIN
CASE NEW.class 
    WHEN 'Первый' THEN 
        SET NEW.price = ( SELECT 1st_class_cost
                          FROM price
                          WHERE nomer_flight_price = NEW.nomer_flight );
    WHEN 'Бизнес' THEN 
        SET NEW.price = ( SELECT business_class_cost
                          FROM price
                          WHERE nomer_flight_price = NEW.nomer_flight );
    WHEN 'Эконом' THEN 
        SET NEW.price = ( SELECT economy_class_cost
                          FROM price
                          WHERE nomer_flight_price = NEW.nomer_flight );
    END;
END

Т.е. в зависимости от значения поля class во вставляемой записи выполняется присвоение вставляемому значению поля price цены, полученной запросом из соответствующего поля таблицы price. Если же поле содержит значение, не упомянутое в вариантах оператора CASE, то никакого SET не будет выполнено, и значение поля price во вставляемой записи не будет изменено.

По завершении работы триггера выполняется собственно вставка, причём вставка записи в том состоянии и с теми значениями полей, которые были установлены/изменены в триггере. Понятно, что если значение поля в триггере не менялось, то вставлено будет значение, предоставленное запросом.

→ Ссылка