SQLite는 if not exist와 유사한 기능을 구현합니다.
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 개념이 없는 것도 내가 아무리 생각해도 이해할 수 없는 이유다.이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SQLite 데이터베이스 설치 및 기본 운영 설명서대부분의 경우 - SQLite의 바이너리 파일이 존재하는지 확인하면 데이터베이스를 만들고 연결하며 사용할 수 있다.내장형 데이터베이스 항목이나 솔루션을 찾고 있다면 SQLite는 매우 고려할 만합니다. SQLite ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.