Создание триггера, не допускающего значения, которого нет в другом столбце

#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. Это прекрасно работает. Я действительно хотел попытаться расширить свои знания о триггере, поэтому это было мое первое предположение, но это работает еще лучше.