code

SQLite 테이블이있는 경우 자르시겠습니까?

codestyles 2021. 1. 5. 08:07
반응형

SQLite 테이블이있는 경우 자르시겠습니까?


SQLite에서 테이블을 자르려면 다음 구문을 사용해야합니다.

DELETE FROM someTable

그러나 테이블이있는 경우에만 테이블을 어떻게자를 수 있습니까?

불행히도 이것은 오류를 발생시킵니다.

DELETE FROM someTable IF EXISTS

이것은 작동하지 않습니다.

DELETE IF EXISTS FROM someTable

감사.


IMHO, 테이블을 삭제하고 다시 만드는 것이 더 효율적입니다. 그리고 예,이 경우 "IF EXISTS"를 사용할 수 있습니다.


2 단계 프로세스입니다.

  1. 다음을 사용하여 해당 테이블에서 모든 데이터를 삭제합니다.

    Delete from TableName
    
  2. 그때:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    

그냥하세요 delete. 이것은 SQLite 문서에서 가져온 것입니다.

자르기 최적화

"DELETE 문에서 WHERE가 생략되고 삭제되는 테이블에 트리거가없는 경우 SQLite는 최적화를 사용하여 테이블의 각 행을 개별적으로 방문하지 않고도 전체 테이블 내용을 삭제합니다.이"잘라 내기 "최적화로 인해 삭제가 많이 실행됩니다. SQLite 버전 3.6.5 이전에는 자르기 최적화가 sqlite3_changes () 및 sqlite3_total_changes () 인터페이스와 count_changes pragma가 실제로 삭제 된 행 수를 반환하지 않음을 의미했습니다.이 문제는 버전 3.6.5부터 수정되었습니다. . "


나는 그것을 함께 일했다.

SQLiteDatabase db= this.getWritableDatabase();
        db.delete(TABLE_NAME, null, null);

SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'

테이블 이름이 없으면 레코드가 반환되지 않습니다!

당신은 또한 사용할 수 있습니다

SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>' 

개수가 1이면 테이블이 있음을 의미하고, 그렇지 않으면 0을 반환합니다.


삭제 후 VACUUM명령 도 사용하고 있습니다. 따라서 전체 TRUNCATE등가물을 위해 다음 코드를 사용합니다.

DELETE FROM <table>;
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>';
VACUUM;

자동 증분 재설정을 위해 삭제가 작동하지 않습니다.

DELETE FROM "sqlite_sequence" WHERE "name"='<table>';

VACUUM에 대한 자세한 내용은 https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/ 에서 확인할 수 있습니다.


불행히도 SQLite에는 "TRUNCATE TABLE"명령이 없지만 SQLite의 DELETE명령을 사용하여 기존 테이블에서 전체 데이터를 삭제할 수 있지만 명령을 사용 DROP TABLE하여 전체 테이블을 삭제하고 한 번 다시 생성하는 것이 좋습니다. 다시.


"sqllite"는 mysql과 같은 "TRUNCATE"순서가 없습니다. 그러면 다른 방법을 찾아야합니다.이 함수 (reset_table)는 먼저 테이블의 모든 데이터를 삭제 한 다음 테이블의 AUTOINCREMENT 키를 재설정합니다 .... 이제 다음 작업을 수행 할 수 있습니다. 이 기능을 원하는 곳에서 사용하십시오 ...

예 :

private SQLiteDatabase mydb;
private final String dbPath = "data/data/your_project_name/databases/";
private final String dbName = "your_db_name";


public void reset_table(String table_name){
    open_db();

    mydb.execSQL("Delete from "+table_name);
    mydb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE name='"+table_name+"';");

    close_db();
}

public void open_db(){

    mydb = SQLiteDatabase.openDatabase(dbPath + dbName + ".db", null, SQLiteDatabase.OPEN_READWRITE);
}
public void close_db(){

    mydb.close();
}

참조 URL : https://stackoverflow.com/questions/4280041/truncate-a-sqlite-table-if-it-exists

반응형