SQLite3에서 자체 증가 키 관련 지식 요약

1. SQLite는 테이블을 비우고 추가 열을 0으로 만듭니다.
SQL 표준에는 테이블의 모든 내용을 비우는 TRUNCATE TABLE 문구가 있습니다.그러나 SQLite는 이 문구를 지원하지 않습니다.SQLite에서 DELETE FROM TableName을 직접 사용하면 됩니다.대부분의 DBMS에 대해 말하자면, DELETE를 사용하는 것이 TRUNCATE를 사용하는 것보다 속도가 빠르다. 왜냐하면 TRUNCATE는 전체 테이블에 접근할 필요가 없고, 데이터의 변동을 기록할 필요가 없기 때문이다.
SQLite는 TRUNCATE를 지원하지 않지만 DELETE에 최적화되어 있습니다. 보통 테이블을 비울 때 자체 증열을 0으로 돌려야 합니다.SQLite에서 자동 증열을 정의하는 방법은 다음과 같습니다
CREATE TABLE TableName ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer );
SQLite 데이터베이스에 자체 추가 열이 포함되면 자동으로 sqlite_sequence의 표.이 표는 두 개의 열을 포함하고 있습니다:name과seq.name는 증열이 있는 표를 기록하고 seq는 현재 번호를 기록합니다. (다음 기록의 번호는 현재 번호 더하기 1).만약 자증열의 번호를 0으로 돌리려면 sqlite_sequence 시계면 되는데..
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';
이 기록을 직접 삭제할 수도 있다
DELETE FROM sqlite_sequence WHERE name='TableName';
모든 테이블의 자증열을 0으로 돌리려면 sqlite_sequence 테이블이면 돼요
DELETE FROM sqlite_sequence;
2. Sqlite에서 INTEGER PRIMARY KEY AUTOINCREMENT 및 rowid의 사용
sqlite 디자인 테이블을 사용할 때 갑자기 문제가 생각났다. 바로 내가 디자인한 테이블에 모든 시계는 자신의 성형 id 값을 메인 키로 하고 있다. 사실은 이런 id 값을 지정하지 않아도 된다. sqlite 내부는 원래 모든 시계에rowid를 추가하는데 이rowid는 은밀한 필드로 사용할 수 있다.
왜 이 내부의rowid를 모든 테이블의 id 키로 직접 사용하지 않습니까?자체 성장 필드를 메인 키로 사용하는 데는 많은 문제가 있다. 예를 들어 유지보수나 대형 분포 응용에서 메인 키 충돌의 해결 등이다.일부 대형 분포 응용에서 메인 키는 일반적으로guid를 선택하는데 이것은 메인 키의 충돌을 효과적으로 피하고 메인 키에 대한 유지 보수 공사를 줄일 수 있다.물론 중소형의 응용에 있어 자성장 필드의 장점은 더욱 많고 간단하며 빠르다.
Sqlite에서 자체 성장 필드를 INTEGER PRIMARY KEY AUTOINCREMENT로 정의하면 새로운 데이터를 삽입할 때 이 필드의 값을 NULL로 지정하면 엔진이 자동으로 그 값을 설정할 수 있습니다. 엔진은 가장 큰rowid+1로 설정할 수도 있고 비NUL의 숫자로 설정해서 이 값을 지정할 수도 있습니다. 그러나 충돌을 일으키지 않도록 조심해야 합니다.
rowid의 새 값은 이 최대 수를 찾기 전에 사용하지 않은 값을 무작위로 찾습니다.그래서rowid가 최대치에 도달하기 전에rowid의 값은 엄격하고 단조롭게 증가한다.INTEGER PRIMARY KEY AUTOINCREMENT 자체 성장 필드의 알고리즘은rowid와 약간 다르다.첫째, 최대치에 도달하면 rowid는 삭제된 필드에 대응하는 rowid를 새 값으로 찾고, 성장 필드에서 SQLITE_FULL의 오류입니다.둘째, 성장 필드에서 새 값을 추가할 때, 사용하지 않은rowid를 새 값으로 찾고, rowid는 가장 큰 rowid+1을 찾습니다.
이것은 응용에 대한 영향이 비교적 크다. 특히 일부 id값에 의존하는 원 기록은 자체 성장 필드만 사용하고 rowid를 사용할 수 없다.예를 들어 우리는 원 기록표를 설계했다
Create table meta_struct(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer);
그리고 다른 표의 구조를 설명하기 위해 1급 표를 정의합니다
Create table meta_table(tableid INTEGER, table_field integer)
마지막으로 우리의 응용은 이 1급표에 따라 실제 사용하는 2급표를 만들 수 있다.이렇게 하면 호환성을 보장합니다. meta_struct의 id는 유일해야 합니다. 필드가 삭제되면 이 필드의 id 값을 반복해서 사용할 수 없습니다. 그렇지 않으면 데이터베이스가 통합될 때 1급표와 2급표가 혼란스러워집니다.그래서 meta_struct표의 메인 키는 자성장 필드만 사용할 수 있고rowid는 사용할 수 없습니다.
셋째, 자체 성장 필드를 사용하면 엔진이 자동으로 sqlite_모든 테이블의 자체 성장 필드에 사용된 최대 값을 기록하는 데 사용되는 Quence 테이블입니다. 사용자가 볼 수 있고 Update, Delete, Insert 작업을 사용할 수 있지만 이렇게 사용하는 것을 권장하지 않습니다. 엔진을 혼란스럽게 합니다.만약 rowid를 사용한다면, 사용자는rowid 값을 유지할 수 있지만, 볼 수 없습니다.

좋은 웹페이지 즐겨찾기