Как создать триггер, который заполнял бы поле значением с другой таблицы?
Столкнулся с такой проблемой. Мне нужно реализовать триггер, который смог бы
вставлять значение с другой таблицы при вставке. То есть писав
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 шт):
Шаблон:
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 во вставляемой записи не будет изменено.
По завершении работы триггера выполняется собственно вставка, причём вставка записи в том состоянии и с теми значениями полей, которые были установлены/изменены в триггере. Понятно, что если значение поля в триггере не менялось, то вставлено будет значение, предоставленное запросом.