Еще вопрос возникает, как можно упростить это? create trigger ed_session after insert on sessions for each row execute procedure create_end_time_session(); === create function create_end_time_session() returns trigger language plpgsql as $$ DECLARE tmstmp timestamp with time zone; dur interval; BEGIN SELECT sessions.time_start, p.duration INTO tmstmp, dur FROM sessions JOIN performances p ON p.id = sessions.performance_id WHERE sessions.id = NEW.id; UPDATE sessions SET time_end = (tmstmp + dur) WHERE id = NEW.id; RETURN NEW; END; $$; alter function create_end_time_session() owner to user_lab1; Триггеры пару раз создавал.
Ну это не нужно вообще
старому преподу не доказать, у него своего мировоззрение
Ну так триггер делай
Подзапросом внутри update можно сделать
Function тут тоже не на фиг не нужен
UPDATE sessions s SET time_end = s.time_start + p.duration FROM sessions b LEFT JOIN performances p on b.performance_id = p.id WHERE s.id = 2; типо того?
Да, но тут должен быть inner join
Ну и это не подзапрос, хотя так тоже можно,
Уточни в доках PG про синтаксис и семантику многотабличных update
Вот тут у тебя две таблицы session, могут быть проблемы
UPDATE sessions s SET time_end = s.time_start + p.duration FROM sessions s LEFT JOIN performances p on s.performance_id = p.id WHERE s.id = 2;
[2021-10-01 07:01:15] [42712] ОШИБКА: имя таблицы "s" указано больше одного раза
А еще проще так UPDATE sessions s SET time_end = s.time_start + (select p.duration FROM performances p where s.performance_id = p.id )
Ну вот уточни...
Тут потому что вопрос s и b - это одна и та же таблица или разные?
это одна и та же таблица, sessions
вот так и оставлю, спасибо
Это твое намерение такое, а по сути это две разные таблицы в запросе
Старый препод оценит, если ты предложишь ему создать view
представления и так есть :)
Если sessions.id — это первичный ключ, то во-первых надо делать before insert и менять new, а не долбить таблицу два раза, а во-вторых — выборка из sessions вообще безсмысленна, у тебя всё в new есть.
Отредачено до https://t.me/dba_ru/141885 Где прекреплен where id = NEW.id
Тогда хотя бы where time_end is null добавьте Вообще, это сильно разные задачи — раскатать такое запросом и повесить триггер.
Обсуждают сегодня