2010-05-06 5 views
25

레코드가 실제로 삽입되지 않은 경우 sqlite 테이블에 레코드를 삽입하려고합니다. 레코드 삽입 SQLite 쿼리가 존재하지 않는 경우

의이 세 가지 필드 PK, 이름이 있다고 가정 해 봅시다

,

나는 그 이름이 preveously 추가하지 않을 경우 이름으로 새 레코드를 삽입 할

주소입니다.

단일 쿼리에서이 작업을 수행 할 수 있습니까? 때로 SQL 쿼리와 약간 다른 것 같습니다.

답변

11

단순히 이름에 고유 색인을 추가하지 않는 이유는 무엇입니까?

+0

CREATE TABLE 사용자 ('PK'INTEGER PRIMARY KEY, '이름'VARCHAR (100), '수'INTEGER) ; 이것은 현재 테이블입니다. 내가 어떻게 바꿀 수 있겠 어. 미안 난 그냥 이해할 수 :( –

+0

그냥 그것을 가지고 이 표 사용자 ('PK'INTEGER PRIMARY KEY, '이름'VARCHAR (100) UNIQUE, '수'INTEGER) CREATE;. 예외를 던지는 것은 당신이 문제를 처리하는 방법이 아니기 때문에 –

+5

을. 당신은 빨리 달릴 질의를 작성하거나 게으르다 수 있습니다. – Dan

68

네, 하나의 쿼리로이 작업을 수행 할 수 있습니다. 갈등

INSERT는 당신을 도움이 무시 : http://www.sqlite.org/lang_conflict.html

는 이름이 이미 존재하는 경우 레코드를 삽입하려고 할 때,이 충돌을 만듭니다 이름을 고유 키를 넣습니다.

기본값은 ABORT이므로 IGNORE가 없으면 명령문이 오류를 반환합니다. 너가 그것을 원하지 않으면, IGNORE를 사용해라.

+1

sqlite> INSERT INTO 사용자 VALUES (1, 'test', 0) ON CONFLICT IGNORE; SQL 오류 : "ON"근처 : 구문 오류 sqlite> sqlite> INSERT OR IGNORE users VALUES (1, 'test', 0); SQL 오류 : "사용자"근처 : 구문 오류 sqlite> sqlite> INSERT INTO 사용자 VALUES (1, 'test', 0) OR IGNORE; SQL 오류 : 근처 "OR": 구문 오류 당신은 나에게 예를 제공 할 수 있습니다. 그냥 성공적으로 그것을 사용할 수 없습니다. 이미 'test'가 테이블에 없으면이 새로운 레코드를 추가하려고합니다. –

+0

이 문제가 해결되었습니다. 이름 필드에 UNIQUE를 추가하는 중입니다. 이제 SQL 오류가 발생하고 데이터가 추가되지 않습니다. CREATE TABLE 사용자 ('pk'INTEGER PRIMARY KEY, 'name'VARCHAR (100) UNIQUE, 'count'INTEGER); –

+16

사용자에게 삽입 또는 무시 VALUES ... – Konerak

22

UNIQUE INDEXINSERT INTO 또는 INSERT OR IGNORE INTO과 함께 사용할 수없는 경우 다음과 같은 검색어를 쓸 수 있습니다.

INSERT INTO table (column) 
SELECT value 
WHERE NOT EXISTS (SELECT 1 
        FROM table 
        WHERE column = value) 
관련 문제