[sqlite] 테이블이 존재하는지 SQLite를 어떻게 확인합니까?

특정 사용자 테이블이 있는지 SQLite에서 확실하게 체크인 하는 방법은 무엇입니까?

테이블의 “select *”가 오류를 반환했는지 여부를 확인하는 것과 같은 신뢰할 수없는 방법을 요구하지 않습니다 (이것은 좋은 생각입니까?).

이유는 다음과 같습니다.

내 프로그램에서 일부 테이블이 존재하지 않으면 테이블을 작성하고 채워야합니다.

이미 존재하는 경우 일부 테이블을 업데이트해야합니다.

문제의 테이블이 이미 생성되었다는 신호를 보내려면 다른 경로를 사용해야합니까?

아니면 내 접근 방식이 의미가 있습니까?



답변

나는 그 FAQ 항목을 놓쳤다.

어쨌든 나중에 참조 할 수 있도록 전체 쿼리는 다음과 같습니다.

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

{table_name}확인할 테이블 이름은 어디에 있습니까 ?

참조를위한 설명서 섹션 : 데이터베이스 파일 형식. 2.6. SQL 데이터베이스 스키마의 저장

  • 지정된 이름의 테이블 목록이 반환됩니다. 즉, 커서는 0의 카운트 (존재하지 않음) 또는 1의 카운트 (존재 함)를 갖습니다.

답변

SQLite 버전 3.3 이상을 사용하는 경우 다음을 사용하여 테이블을 쉽게 만들 수 있습니다.

create table if not exists TableName (col1 typ1, ..., colN typN)

같은 방법으로 다음을 사용하여 테이블이 존재하는 경우에만 테이블을 제거 할 수 있습니다.

drop table if exists TableName


답변

변형은 SELECT NAME 대신 SELECT COUNT (*)를 사용하는 것입니다.

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

테이블이 존재하지 않으면 0을, 존재하면 1을 리턴합니다. 수치 결과가 더 빠르고 쉽게 처리되므로 프로그래밍에 유용 할 것입니다. 다음은 SQLiteDatabase, Cursor, rawQuery를 매개 변수와 함께 사용하여 Android에서이를 수행하는 방법을 보여줍니다.

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}


답변

시도해 볼 수 있습니다 :

SELECT name FROM sqlite_master WHERE name='table_name'


답변

사용하다:

PRAGMA table_info(your_table_name)

결과 테이블이 비어 있으면 your_table_name존재하지 않습니다.

선적 서류 비치:

PRAGMA schema.table_info (테이블 이름);

이 pragma는 명명 된 테이블의 각 열에 대해 하나의 행을 반환합니다. 결과 집합의 열에는 열 이름, 데이터 형식, 열이 NULL 일 수 있는지 여부 및 열의 기본값이 포함됩니다. 기본 키의 일부가 아닌 열의 경우 결과 집합의 “pk”열이 0이고 기본 키의 일부인 열의 기본 키 열의 인덱스입니다.

table_info pragma에 명명 된 테이블도 뷰가 될 수 있습니다.

출력 예 :

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0


답변

SQLite 테이블 이름은 대소 문자를 구분하지 않지만 비교는 기본적으로 대소 문자를 구분합니다. 모든 경우에이 작업을 제대로 수행하려면 추가해야합니다 COLLATE NOCASE.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE


답변

“테이블이 이미 존재합니다”오류가 발생하면 다음과 같이 SQL 문자열을 변경하십시오.

CREATE table IF NOT EXISTS table_name (para1,para2);

이런 식으로 예외를 피할 수 있습니다.