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가 IF NOT EXISTS를 지원하지 않거나 적어도 작동하도록 할 수없는 것 같습니다. 나는 단순한 것을 놓치고 있습니까? 해결 방법이 있습니까?

답변:


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 Received'는 테이블에 아직없는 경우에만 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

KEY 필드를 사용하여 테이블에 대한 제약 조건을 설정하고 On Conflict "Ignore"를 설정할 수도 있습니다.

적용 가능한 제약 조건 위반이 발생하면 IGNORE 해결 알고리즘은 제약 조건 위반이 포함 된 한 행을 건너 뛰고 아무 문제가없는 것처럼 SQL 문의 후속 행을 계속 처리합니다. 제한 조건 위반이 포함 된 행 앞뒤의 다른 행이 정상적으로 삽입되거나 업데이트됩니다. IGNORE 충돌 해결 알고리즘을 사용하면 오류가 반환되지 않습니다.

SQLite 문서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.