[컴][DB] sqlite 의 rowid

sqlite 의 primary key / sqlite 의 integer primary key / rowid


SQL As Understood By SQLite : http://www.sqlite.org/lang_createtable.html

위의 글의 "ROWIDs and the INTEGER PRIMARY KEY" 에 대한 설명을 번역한 내용이다.


모든 SQLite table 의 모든 row는 64-bit signed integer key 를 가지고 있다. 이것을 "rowid" 라고 한다. 이 "rowid" 는 case-independent 이름(대문자, 소문자에 관계없는 이름) 이다.
column name 에 "rowid", "oid", "_rowid_" 를 이용할 수 있다.

만약 user 가 "rowid" 이름으로 column 을 선언했다면 "rowid" 를 부르면 user 가 선언한 column 이 불려지고, "rowid" 로는 integer rowid 값을 retrieve 할 수 없게 된다.

each table 의 data 는 각 table 의 row (entry) 를 B-Tree 구조로 저장되어 있다. 이 때 key 로 rowid 를 사용한다. 그러므로 rowid 로 retrieve / sort 를 rowid 로 하는 것이 빠르다는 얘기가 된다. 특정한 rowid 를 찾거나, 특정한 범위의 모든 records 를 찾는 것이 다른 PRIMARY KEY 나 indexed value 를 이용하는 것보다 약 2배정도 빠르다.

한개의 column 으로 구성된 primary key 를 가진 table이면, 어떤 이름(대문자와 소문자를 어떻게 조합하던지 상관없다.)의 column 이 INTEGER type 으로 정의(declare)되어 있으면 그러면 column 은 rowid 의 다른 이름(alias) 가 된다. 이녀석은 일반적으로 "integer primary key" 라고 얘기한다. 이 때 주의할 점은 선언(declare) 할 때 반드시 INTEGER 를 사용해야 한다. "INT", "BIGINT", "SHORT INTEGER", "UNSIGNED INTEGER" 등으로 선언을 하면 rowid 의 alias, 즉 "integer primary key" 로 동작하지 않는다.

그리고 INTEGER 에 "PRIMARY KEY DESC" 를 붙이는 것도 안된다. 이것은 design 을 그렇게 한 것이 아니라 SQLite 의 bug 때문이다. 이 bug 를 고치는 것이 backward compatibility 의 문제를 일으킬 수 있어서 고치지 않고 있다.

아래 3가지 경우는 integer primary key(row id 의 alias) 가 되는 경우들이다.


  • CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z);
  • CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x ASC));
  • CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC));


그렇지만 아래의 경우는 안된다.

  • CREATE TABLE t(x INTEGER PRIMARY KEY DESC, y, z);

UPDATE, INSERT  로 rowid 도 수정할 수 있다.

integer primary key 는 무조건 integer 값을 가지고 있어야만 한다. floating point, string, BLOB, NULL 등의 값은 안된다.

UPDATE 의 명령(statement) 이 만약에 integer 가 아닌 다른 값들을 가지고 있다면 "datatype mismatch" error 가 발생해서 UPDATE statement 가 abort 된다.

INSERT 에서는 NULL 을 넣으려 하는 경우에는 system 에서 자동적으로 integer 값을 넣어준다.

foreign key constraint의 parent key 가 rowid 를 이용할 수는 없다. parent key 는 named column 들만 사용해야 한다.(?)


See Also


  1. http://gywn.net/2013/08/let-me-intorduce-sqlite/




댓글 없음:

댓글 쓰기