조건부로 행 ID를 삽입 하시겠습니까?

.net dapper sql sqlite

문제

주제가 해당 섹션에서 유일한 경우에만 스레드를 만들고 싶습니다. 그런 다음 스레드의 행 ID를 가져 오려고합니다. 어떻게 안전하게 작성합니까? 내 생각은

connection.Query<long>(@"insert into thread(section, subject, body) 
    select @section,@subject,@body
    where not exists in (select 1 from thread where section=@section and subject=@subject;
    select last_insert_rowid()", new {...}).First();

문제는 내가 last_insert_rowid 과거 또는 내 삽입 진술에서 뭔가 있는지 모르겠다. 이 쿼리를 안전하게 작성하려면 어떻게해야합니까?

인기 답변

올바르게 이해한다면 OR IGNORE 구문을 사용할 수 있습니다. 그것이 작동하기 위해서는 sectionsubject 에 대해 UNIQUE 제약 조건을 가져야합니다.

CREATE TABLE thread
(id INTEGER PRIMARY KEY, 
 section INT, 
 subject TEXT(128), 
 body TEXT(256),
 UNIQUE (section, subject));

제약 조건 중 하나를 위반하는 행을 무시합니다.

INSERT OR IGNORE INTO thread (section, subject, body)
VALUES (1, 'Subject1', 'Body1');

삽입이 성공하면 LAST_INSERT_ROWID() 는 삽입 된 행에 대한 ID를 반환합니다. 그러나 section 에 대한 복제본이었고 subject 삽입에 실패하면 0 을 반환합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.