SQLite는 if not exist와 유사한 기능을 구현합니다.

3259 단어 SQLiteifnotexist
필요:

if not exists(select * from ErrorConfig where Type='RetryWaitSeconds')
begin
  insert into ErrorConfig(Type,Value1)
  values('RetryWaitSeconds','3')
end
사용 가능:

insert into ErrorConfig(Type,Value1)
select 'RetryWaitSeconds','3'
where not exists(select * from ErrorConfig where Type='RetryWaitSeconds')
SQLite에서 SP가 지원되지 않으므로
보충: sqlite3에서 NOT IN 안 좋은 문제
sqlite3로 SQL을 익힐 때 헤아릴 수 없는 문제를 만났고 구글에서도 답을 찾지 못했다.마지막으로'우회'방식으로 공교롭게 이 문제를 해결했지만 원리가 무엇인지 당분간 알 수 없고 현재 정력이 한계가 있기 때문에 잠시 기록해 두고 계속 연구해야 한다.
데이터베이스는 다음과 같습니다.

CREATE TABLE book (
 id integer primary key,
 title text,
 unique(title)
);
CREATE TABLE checkout_item (
 member_id integer,
 book_id integer,
 movie_id integer,
 unique(member_id, book_id, movie_id) on conflict replace,
 unique(book_id),
 unique(movie_id)
);
CREATE TABLE member (
 id integer primary key,
 name text,
 unique(name)
);
CREATE TABLE movie (
 id integer primary key,
 title text,
 unique(title)
);
이 데이터베이스는 4개의 표를 포함하고 있습니다:book,movie,member,checkout_item.그중, checkout_item은 회원이 책과 영화에 대한 대출 기록을 저장하는 데 사용되며, 관계표에 속합니다.

질문1: 어떤 회원이 아직 대출 기록을 보지 않았습니까?


SQL 문장(SQL1)은 다음과 같습니다.

SELECT * FROM member WHERE id NOT IN(SELECT member_id FROM checkout_item);
원하는 결과를 얻다.

문2: 어떤 책이 대출되지 않았습니까?


이것은 이전과 유사해 보이기 때문에 나는 당연히 다음과 같은 SQL 문장(SQL2)을 실행했다.

SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item);
그러나 운행 결과는 아무런 기록도 찾지 못했다.나는 SQL2와 SQL1이라는 두 문장이 어떤 차이가 있는지 모르겠다. 설마 책표의 문제인가?그래서 NOT를 제거하고 다음과 같은 검색어를 실행했습니다.

SELECT * FROM book WHERE id IN(SELECT book_id FROM checkout_item);
빌려준 책을 정확하게 되돌려줍니다. 그 수량은 책 표의 본점 수보다 적습니다. 즉, 책이 빌려주지 않은 것이 확실합니다.
이어 구글은 해결책을 찾지 못했다.그런데 왜 member는 되고 책은 안 돼요?그것들은 이전에 무엇이 달라졌습니까?자세히 살펴보니 checkout_item의 book_id와 movie_id에 유니크가 추가되었고member_id는 없습니다.그렇게 지도 모른다, 아마, 아마...id 필요 없어요. 타이틀을 바꿔보세요.

SELECT * FROM book WHERE 
 title NOT IN( 
 SELECT title FROM book WHERE id IN(
 SELECT book_id FROM checkout_item));
확실히 우회적이긴 하지만 적어도 워크는...

문제 원인: NULL을 건드리지 않으면


사실은, 내 자신의 해결 방안은 공교롭게work에 불과하고, 이 문제는 유니크와 관계가 없다.구 준도는'SELECT book_id FROM checkout_item'결과에 null 값이 포함되어 NOT도 null로 되돌아갔다는 설명이다.회원이 영화만 빌리고 책을 빌리지 않았을 때 발생하는 checkout_item에서 book_id는 비어 있습니다.
솔루션은 checkout_ 선택item의 book_id 시,null 값을 book_id 제거:

SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item WHERE book_id IS NOT NULL);

총결산


내가 이 문제를 해결할 때 방향이 틀렸으니 디버깅 프로그램처럼 중간 결과를 검사해야 한다.예를 들어, 다음 문장을 실행하면 빈 줄이 포함됩니다.

SELECT book_id FROM checkout_item
다음 문장을 실행하면 빈 줄이 포함되지 않습니다.

SELECT member_id FROM checkout_item
이것이야말로 SQL1과 SQL2 두 문장의 실행 과정 중의 차이이다.이 차이에 따라 구글에 가면 답을 찾기 쉽다.물론 NULL 개념이 없는 것도 내가 아무리 생각해도 이해할 수 없는 이유다.
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기