Як це зробити, ЯКЩО НЕ ІСНУЄ в 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' відповідає дійсності.
Michael

Намір полягає в тому, щоб EventTypeName був унікальним. Нове значення "Отримано ANI" вставляється в таблицю EVENTTYPE, лише якщо воно ще не існує в таблиці. Це те, що входить WHERE NOT EXISTS. Речення SELECT WHERE NOT EXISTS може повернути лише один рядок; немає речення FROM - немає можливості повернути кілька рядків. Сподіваюся, це прояснить.
пляж

1
Це дуже поганий стиль кодування. При кожній помилці запит буде мовчки невдалим! З документації: IGNOREКоли виникає відповідне порушення обмеження, алгоритм роздільної здатності IGNORE пропускає один рядок, що містить порушення обмеження, і продовжує обробку наступних рядків оператора SQL, ніби нічого не пішло не так. Інші рядки до та після рядка, що містив порушення обмеження, вставляються або оновлюються нормально. Помилка не повертається, коли використовується алгоритм вирішення конфліктів IGNORE.
ManuelSchneid3r

12

Якщо ви хочете проігнорувати вставку існуючого значення, у вашій таблиці має бути поле Ключ. Просто створіть таблицю з полем первинного ключа, як:

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

Ви також можете встановити обмеження для таблиці за допомогою полів КЛЮЧ і встановити для конфлікту "Ігнорувати"

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.