Как сделать ЕСЛИ НЕ СУЩЕСТВУЕТ в SQLite

80

Я пытаюсь перенести эту строку с MS SQL Server на SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

Кажется, что SQLite не поддерживает ЕСЛИ НЕ СУЩЕСТВУЕТ, или, по крайней мере, я не могу заставить его работать. Я упустил что-то простое? Есть ли обходной путь?

Злой Хакер
источник

Ответы:

120

Как насчет этого?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(Не проверено, поскольку у меня нет SQLite ... однако эта ссылка довольно информативна.)

Кроме того, это также должно работать:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');
пляж
источник
14
Благодарю. Однако следует отметить, что элемент INSERT OR IGNORE работает только в том случае, если EventTypeName установлен как уникальный.
AngryHacker
2
Правда. Я предположил, что он уникален, учитывая то, как он использовался в примере SQL. Если нет, следует использовать второй метод.
пляж,
Можно ли действительно использовать второй метод, если EventTypeName не уникален? Я пытаюсь сделать что-то подобное и обнаружил, что предложение SELECT WHERE NOT EXISTS возвращает несколько строк, фактически каждую строку, где (эквивалент) EventTypeName! = 'ANI Received' истинно.
Майкл
Намерение состоит в том, чтобы EventTypeName был уникальным. Новое значение «ANI Received» вставляется в таблицу EVENTTYPE, только если оно еще не существует в таблице. Это то, что входит в действие WHERE NOT EXISTS. Предложение SELECT WHERE NOT EXISTS может возвращать только одну строку; здесь нет предложения FROM - невозможно вернуть несколько строк. Надеюсь, это проясняет ситуацию.
пляж,
1
Это очень плохой стиль программирования. При каждой ошибке запрос автоматически завершается ошибкой! Из документации: IGNOREПри возникновении применимого нарушения ограничения алгоритм разрешения IGNORE пропускает одну строку, которая содержит нарушение ограничения, и продолжает обработку последующих строк оператора SQL, как будто ничего не пошло не так. Другие строки до и после строки, содержащей нарушение ограничения, вставляются или обновляются обычным образом. При использовании алгоритма разрешения конфликтов IGNORE ошибка не возвращается.
ManuelSchneid3r
12

Если вы хотите игнорировать вставку существующего значения, в вашей таблице должно быть поле Key. Просто создайте таблицу с полем первичного ключа, например:

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

А затем вставьте или замените / вставьте или игнорируйте запрос в таблице, например:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

Он не позволит повторно ввести существующее значение первичного ключа ... Вот как вы можете проверить, существует ли значение в таблице или нет.

Декан
источник
1

Вы также можете установить ограничение для таблицы с полями KEY и установить On Conflict "Ignore"

Когда происходит применимое нарушение ограничения, алгоритм разрешения IGNORE пропускает одну строку, которая содержит нарушение ограничения, и продолжает обработку последующих строк оператора SQL, как будто ничего не пошло не так. Другие строки до и после строки, содержащей нарушение ограничения, вставляются или обновляются обычным образом. При использовании алгоритма разрешения конфликтов IGNORE ошибка не возвращается.

Документация по SQLite

1 фунт 3 фунта
источник