SQLITE 인덱스가 고유한지 어떻게 알 수 있습니까? (SQL 포함)

StackOverflow https://stackoverflow.com/questions/157392

  •  03-07-2019
  •  | 
  •  

문제

인덱스가 고유한지 아닌지 SQL 쿼리를 사용하여 알고 싶습니다. SQLITE 3을 사용하고 있습니다.

두 가지 접근 방식을 시도했습니다.

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

이것은 색인 ( "type", "name", "tbl_name", "rootpage"및 "sql"에 대한 정보를 반환합니다. 인덱스가 SQLite에 의해 자동으로 생성 될 때 SQL 열이 비어 있습니다.

PRAGMA index_info(sqlite_autoindex_user_1);

이렇게하면 인덱스의 열을 반환합니다 ( "seqno", "cid"및 "name").

다른 제안이 있습니까?

편집하다: 위의 예는 자동 생성 된 인덱스에 대한 것이지만 내 질문은 일반적으로 인덱스에 관한 것입니다. 예를 들어, "방문 (사용자, 날짜)에 고유 한 색인 인덱스 1을 만드는 색인을 만들 수 있습니다. 새 인덱스가 고유한지 여부는 SQL 명령이 표시되지 않을 것 같습니다.

도움이 되었습니까?

해결책

PRAGMA INDEX_LIST('table_name');

3 개의 열이있는 테이블을 반환합니다.

  1. seq 인덱스의 고유 한 숫자 ID
  2. name 색인의 이름
  3. unique 고유성 깃발 (0이 아닌 IF UNIQUE 인덱스.)

그런 다음 쿼리하려는 색인의 이름이 표시 될 때까지 결과 행을 루프합니다 (불행히도 가질 수 없습니다. WHERE a PRAGMA 성명.)

다른 팁

아무도 좋은 답변을 얻지 못하기 때문에 최선의 해결책은 다음과 같습니다.

  • 인덱스가 "sqlite_autoindex"로 시작하면 단일 고유 한 열의 자동 생성 인덱스입니다.
  • 그렇지 않으면 테이블 sqlite_master의 SQL 열에서 고유 한 키워드를 찾으십시오.

    sqlite_master에서 *를 선택하십시오.

튜플이 둘 이상의 행을 가리키는 지 확인하기 위해 프로그램 적 명령문을 프로그래밍 방식으로 구축 할 수 있습니다. Foo, Bar 및 BAZ의 세 열을 되 찾으면 다음 쿼리를 만듭니다.

select count(*) from t
group by foo, bar, baz
having count(*) > 1

그것이 행을 반환하는 경우, 주어진 튜플에 둘 이상의 행 맵이 있기 때문에 인덱스가 고유하지 않습니다. SQLITE3이 파생 테이블을 지원하는 경우 (아직 필요하지 않아서 손을 모릅니다) 더 간결하게 만들 수 있습니다.

select count(*) from (
    select count(*) from t
    group by foo, bar, baz
    having count(*) > 1
)

이것은 중복 튜플 세트의 수를 나타내는 단일 행 결과 세트를 반환합니다. 긍정적 인 경우 인덱스가 고유하지 않습니다.

당신은 가까이 있습니다 :

1) 색인이 시작된 경우 "sqlite_autoindex", 기본 키에 대한 자동 생성 인덱스입니다. 그러나 이것은 다음에있을 것입니다 sqlite_master 또는 sqlite_temp_master 테이블이 색인화되는 테이블에 따라 테이블이 일시적입니다.

2) 부분 문자열이 포함 된 테이블 이름과 열을 조심해야합니다. unique, 당신은 사용하고 싶습니다 :

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

sqlite 웹 사이트 문서를 참조하십시오 인덱스를 만듭니다

SQLITE 3.16.0 기준 Pragma 기능도 사용할 수도 있습니다.

SELECT distinct il.name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

위의 진술에는 고유 한 인덱스의 모든 이름이 나열됩니다.

SELECT DISTINCT m.name as table_name, ii.name as column_name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

열이 고유 인덱스의 일부인 경우 위의 진술은 모든 테이블과 열을 반환합니다.

로부터 문서:

Pragma 기능의 테이블 값 기능은 SQLITE 버전 3.16.0 (2017-01-02)에 추가되었습니다. 사전 버전의 SQLITE는이 기능을 사용할 수 없습니다.

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