문제

DB에 삽입 할 문자열 목록이 있습니다. 그들은 독특해야합니다. 내가 삽입 할 때 그들의 ID (다른 테이블에서 외국 키로 사용하기 위해)를 원하므로 last_insert_rowid를 사용합니다. 나는 두 가지 문제가 있습니다.

  1. 대체를 사용하는 경우 DB를 깨뜨리는 ID (정수 기본 키) 업데이트 (항목이 존재하지 않는 ID를 가리 킵니다)
  2. 무시를 사용하면 Rowid가 업데이트되지 않으므로 올바른 ID를 얻지 못합니다.

ID를 어떻게 얻습니까? 필요하지 않은 경우 선택 문을 사용하여 문자열이 존재하지 않는 경우 문자열을 확인하고 삽입하고 싶지 않습니다. 어떻게해야합니까?

도움이 되었습니까?

해결책 2

나는 현재 아래를 사용합니다

insert into tbl(c_name) select 'val' where not exists(select id from tbl where c_name ='val');
select id from tbl where c_name ='val';

다른 팁

고유 한 구속 조건 위반이 발생하면 교체 알고리즘은 현재 행을 삽입하거나 업데이트하기 전에 제약 조건 위반을 일으키는 기존 행을 삭제하며 명령은 정상적으로 실행됩니다. 이로 인해 Rowid가 변경되고 다음과 같은 문제가 발생합니다.

Y:> **sqlite3 test**  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> **create table b (c1 integer primary key, c2 text UNIQUE);**  
sqlite> **insert or replace into b values (null,'test-1');**  
sqlite> **select last_insert_rowid();**  
1  
sqlite> **insert or replace into b values (null,'test-2');**  
sqlite> **select last_insert_rowid();**  
2  
sqlite> **insert or replace into b values (null,'test-1');**  
sqlite> **select last_insert_rowid();**  
3  
sqlite> **select * from b;**  
2|test-2  
3|test-1  

주변의 작업은 다음과 같이 C2 열의 정의를 변경하는 것입니다.

create table b (c1 integer primary key, c2 text UNIQUE ON CONFLICT IGNORE);

인서트에서 "또는 교체"절을 제거하려면;

그런 다음 삽입 후 테스트 할 때 다음 SQL을 실행해야합니다. select last_insert_rowid(), changes();

sqlite> **create table b (c1 integer primary key, c2 text UNIQUE ON CONFLICT IGNORE);**  
sqlite> **insert into b values (null,'test-1');**  
sqlite> **select last_insert_rowid(), changes();**  
1|1  
sqlite> **insert into b values (null,'test-2');**  
sqlite> **select last_insert_rowid(), changes();**  
2|1  
sqlite> **insert into b values (null,'test-1');**  
sqlite> **select last_insert_rowid(), changes();**  
2|0  

세 번째 삽입 후 변경 사항의 반환 값은 이미 파일에 있었기 때문에 "Test-1"의 Rowid를 조회해야한다는 응용 프로그램에 알림이됩니다. 물론 이것이 다중 사용자 시스템이라면 거래 에서이 모든 것을 마무리해야합니다.

"그들은 독특해야한다"라는 말은 당신이 그들이 그렇지 않은 경우 결과적으로 오류를 원한다는 것을 확신한다는 것을 의미합니까? 문자열 자체를 테이블의 키로 만들면 1 또는 2가 어떻게 문제가 될 수 있는지 이해하지 못합니다. 원치 않는 복제의 경우 원하는대로 오류가 발생합니다. 그렇지 않으면 올바른 ID입니다. 아마도 당신이 사용하고있는 SQL 코드의 작은 예, 해당 테이블, 어떤 행동을 관찰하고 있는지, 대신 원하는 행동 ...?

편집 : 편집 해 주셔서 감사합니다. 그러나 어떤 SQL이 어떤 문제를주고 있는지 여전히 불분명합니다! 테이블이 오면 (예 :

CREATE TABLE Foo(
  theid INTEGER PRIMARY KEY AUTOINCREMENT,
  aword TEXT UNIQUE ABORT
  )

그러면 복제 된 단어를 삽입하려는 시도는 실패합니다 ( ABORT 키워드는 선택 사항입니다. 기본값이므로 UNIQUE) - 그게 당신이 아닙니다 원하다 당신이 "독특해야한다"라는 단어를 말하면, 그렇지 않은 경우 오류입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top