Jak to zrobić, JEŚLI NIE ISTNIEJE w SQLite


80

Próbuję przenieść tę linię z MS SQL Server do SQLite

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

Wygląda na to, że SQLite nie obsługuje funkcji JEŚLI NIE ISTNIEJE lub przynajmniej nie mogę sprawić, by działało. Czy brakuje mi czegoś prostego? Czy jest w pobliżu praca?

Odpowiedzi:


120

Co powiesz na to?

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

(Niesprawdzone, ponieważ nie mam oprogramowania SQLite ... jednak ten link jest dość opisowy).

Dodatkowo powinno to również działać:

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

14
Dzięki. Należy jednak zauważyć, że element INSERT OR IGNORE działa tylko wtedy, gdy EventTypeName jest ustawiony jako unikalny.
AngryHacker,

2
Prawdziwe. Założyłem, że jest unikalny, biorąc pod uwagę sposób, w jaki został użyty w przykładowym SQL. Jeśli nie, należy zastosować drugą metodę.
plaża

Czy naprawdę można użyć drugiej metody, jeśli EventTypeName nie jest unikalna? Próbuję zrobić coś podobnego i stwierdzam, że klauzula SELECT WHERE NOT EXISTS zwraca wiele wierszy, w rzeczywistości każdy wiersz, w którym (odpowiednik) EventTypeName! = „ANI Received” jest prawdziwy.
Michael

Celem jest, aby EventTypeName był unikalny. Nowa wartość „ANI Received” jest wstawiana do tabeli EVENTTYPE tylko wtedy, gdy nie istnieje jeszcze w tabeli. Oto, co pojawia się w sekcji WHERE NOT EXISTS. Klauzula SELECT WHERE NOT EXISTS może zwracać tylko jeden wiersz; nie ma klauzuli FROM - nie ma możliwości zwrócenia wielu wierszy. Mam nadzieję, że to wyjaśnia sprawę.
plaża

1
To bardzo zły styl kodowania. Przy każdym błędzie zapytanie po cichu zakończy się niepowodzeniem! Z dokumentacji: IGNOREw przypadku naruszenia stosownego ograniczenia algorytm rozpoznawania IGNORE pomija jeden wiersz zawierający naruszenie ograniczenia i kontynuuje przetwarzanie kolejnych wierszy instrukcji SQL, tak jakby nic nie poszło źle. Pozostałe wiersze przed i za wierszem zawierającym naruszenie ograniczenia są wstawiane lub aktualizowane normalnie. Żaden błąd nie jest zwracany, gdy używany jest algorytm rozwiązywania konfliktów IGNORE.
ManuelSchneid3r

12

Jeśli chcesz zignorować wstawienie istniejącej wartości, w tabeli musi znajdować się pole Klucz. Po prostu utwórz tabelę z podstawowym polem kluczowym, takim jak:

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

A następnie wstaw lub zamień / wstaw lub zignoruj ​​zapytanie w tabeli, na przykład:

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

Nie pozwoli mu ponownie wprowadzić istniejącej wartości klucza podstawowego ... W ten sposób można sprawdzić, czy wartość istnieje w tabeli, czy nie.


1

Możesz również ustawić ograniczenie w tabeli za pomocą pól KEY i ustawić opcję „Ignoruj” w przypadku konfliktu

W przypadku naruszenia odpowiedniego ograniczenia algorytm rozpoznawania IGNORE pomija jeden wiersz zawierający naruszenie ograniczenia i kontynuuje przetwarzanie kolejnych wierszy instrukcji SQL, tak jakby nic nie poszło źle. Pozostałe wiersze przed i za wierszem zawierającym naruszenie ograniczenia są wstawiane lub aktualizowane normalnie. Żaden błąd nie jest zwracany, gdy używany jest algorytm rozwiązywania konfliktów IGNORE.

Dokumentacja SQLite

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.