#sqlite #triggers #foreign-keys #referential-integrity
Вопрос:
У меня есть вопрос о триггере, который я хотел бы создать, и я не уверен, как это сделать.
У меня есть таблица 2017_state_data, и она содержит некоторые финансовые показатели по штату вместе с указанным названием штата. Теперь важно, чтобы название состояния всегда было правильным (и чтобы состояние, конечно, существовало), и я хотел бы создать триггер, в котором, если значение «Состояние» не совпадает с именами состояний (из другой таблицы), оно должно выдавать предупреждающее сообщение в виде «Неизвестное состояние в записи». Я не совсем уверен, как ссылаться на столбцы из другой таблицы для использования в триггере, и я надеялся, что кто-нибудь сможет мне помочь.
Триггер, который я создал, приведен ниже, но это не работает и оставляет меня с ошибкой «неполный ввод».
CREATE TRIGGER sureState
BEFORE INSERT ON 2017_state_data
FOR EACH ROW
WHEN NEW.State != (SELECT StateName FROM States)
BEGIN SELECT RAISE(ABORT, "Unknown state in entry")
END;
Заранее спасибо за всю вашу помощь.
Комментарии:
1. Я не разбираюсь в SQLite, но попробуйте изменить «!=» на «Не в». Вы пытаетесь сравнить одно значение со всей таблицей. Посмотрим, сработает ли это.
2. К сожалению, я все еще получаю ту же ошибку.
Ответ №1:
У вашего требования есть имя, и оно является ссылочной целостностью.
Все, что вам нужно сделать, это определить столбец State
таблицы 2017_state_data
так, чтобы он ссылался на столбец StateName
таблицы States
:
CREATE TABLE 2017_state_data (
........................
State TEXT REFERENCES States(StateName),
........................
);
Теперь, если вы включите поддержку внешних ключей (которая по умолчанию отключена) с:
PRAGMA foreign_keys = ON;
вы убедитесь, что никакое значение, которое не существует StateName
, не может быть введено, State
и нет необходимости в триггере.
Комментарии:
1. Это прекрасно работает. Я действительно хотел попытаться расширить свои знания о триггере, поэтому это было мое первое предположение, но это работает еще лучше.