Триггер ссылочной целостности SQL

#mysql #sql #triggers #database-trigger

#mysql #sql #триггеры #база данных-триггер

Вопрос:

CREATE TRIGGER FK_INTEGRITY_CHECK
BEFORE INSERT ON sch_book_list
FOR EACH ROW BEGIN
SELECT CASE
WHEN ((SELECT resource_cd FROM sch_resource WHERE resource_cd = NEW.resource_cd) IS NULL)
THEN RAISE(ABORT, 'insert on table "sch_book_list" violates foreign key '|| 'constraint "FK9qti8knho9i047jd1lrwqwy2x"')
END
END;

Это мой код триггера, но есть некоторая синтаксическая ошибка. Я не знаю, в чем ошибка?

Комментарии:

1. Что это за функция RAISE() ? У MySQL его нет .. Также MySQL не поддерживает || объединение строк, если оно не включено, поэтому я очень сомневаюсь, что вы используете MySQL здесь.

Ответ №1:

Вместо использования CASE вы можете сохранить количество в переменной и проверить значение, например:

 CREATE TRIGGER FK_INTEGRITY_CHECK
BEFORE INSERT ON sch_book_list
FOR EACH ROW BEGIN 
    DECLARE row_count INT;
    SET row_count = (SELECT COUNT(*) FROM sch_resource WHERE resource_cd = NEW.resource_cd)
    IF (row_count = 0) THEN
      RAISE(ABORT, 'insert on table "sch_book_list" violates foreign key '|| 'constraint "FK9qti8knho9i047jd1lrwqwy2x"');
    END IF;
END;