Как сделать ЕСЛИ НЕ СУЩЕСТВУЕТ в 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.