Триггер SQLite всегда срабатывает

#sqlite #triggers #insert

#sqlite #триггеры #вставить

Вопрос:

Я бы вставил в таблицу полей uni элемент, если он не существует; для этого у меня есть простой триггер:

 CREATE TRIGGER Insert_Producer
    BEFORE INSERT
    ON Producers
    WHEN NEW.Producer NOT IN (SELECT Producer FROM Producers)
BEGIN
    INSERT INTO Producers values(NEW.Producer);
END
 

Но это не работает, и я не могу понять, почему.
Спасибо

Ответ №1:

Я предполагаю, что в таблице Producers есть и другие столбцы, кроме Producer too.
Если это так, то это утверждение выдаст ошибку:

 INSERT INTO Producers values(NEW.Producer);
 

Вы должны указать в инструкции столбец, который получит значение NEW.Producer :

 INSERT INTO Producers(Producer) values(NEW.Producer);
 

Даже если вы внесете это изменение, триггер не будет делать то, что вы ожидаете, потому что там нет ничего, что могло бы прервать вставку новой строки, если значение уже существует в таблице.

Но вам не нужен этот триггер.
Все, что вам нужно сделать, это определить a UNIQUE constraint для столбца Producer , и все готово.

Ответ №2:

Я нашел рабочий триггер:

 CREATE TRIGGER Insert_Producer
    BEFORE INSERT
    ON Producers
BEGIN
    SELECT
    CASE 
    WHEN NEW.Producer IN (SELECT Producer FROM Producers) THEN
    RAISE(IGNORE)
    END;
END;
 

Может быть, это не самое лучшее, но таблица очень маленькая.