Написать триггер и функцию на pl/sql

Рейтинг: 0Ответов: 0Опубликовано: 31.05.2023

Есть таблица cars с атрибутами id, location_id(внешний ключ на атрибут id другой таблицы location). Я хочу написать функцию и триггер, которые будут работать так -при попытке обновить location_id у элемента с указанным id,если location_id и/или id не существуют то на консоль выходит ошибка типа - 'не существует id с таким значением'. Пример запроса - update cars set location_id=10 where id=10 - элементов со значением 10 нет в моей таблице Что я написал -

CREATE OR REPLACE FUNCTION update_cars()
  RETURNS TRIGGER AS $$
BEGIN
  -- Проверяем существование значения location_id в таблице location
  IF NOT EXISTS (SELECT 1 FROM location WHERE id = NEW.location_id) THEN
    RAISE EXCEPTION 'Invalid location_id: %', NEW.id;
  END IF;
  -- Проверяем существование значения id в таблице cars
  IF NOT EXISTS (SELECT 1 FROM cars WHERE id = NEW.id) THEN
    RAISE EXCEPTION 'Invalid id: %', NEW.id;
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER update_cars_trigger
  before UPDATE ON cars
  FOR EACH ROW
  EXECUTE FUNCTION update_cars();

В чем проблема - если я указываю только несуществующий location_id то функция выдает ошибку о том, что нет такого id у location, как я и хотел, но если я также указываю несуществующий id или только несуществующий id, то на консоль после попытке обновления выходит -'update 0' - но я хочу чтобы на экран выходила ошибка как я указал в функции, как это можно сделать и почему вообще такое происходит?

update: в обоих таблицах только 3 элемента соответственно в обоих только элементы с id=1,2,3 пример с несуществующим location_id и его результат в консоли(элемент с id=1 в таблице car есть, а с id=10 в таблице location нет

update cars set location_id=10 where id=1;
[P0001] ОШИБКА: Invalid location_id: 10
Где: функция PL/pgSQL update_cars(), строка 5, оператор RAISE 

То есть видно ,что работает как я и хотел. Теперь пример с проблемой, то есть я указываю несуществующий id у cars:

update cars set location_id=1 where id=5;
update 0;

Ошибки нет, просто ничего не происходит, хотя по логике моей функции должна вывестись ошибка

Ответы

Ответов пока нет.