테이블 생성하기 – SQLite3

SQLite에서 테이블을 생성하는 방법에 대해서 알아보자. 테이블을 생성할 때는 CREATE TABLE 구문을 사용한다. 이 구문에서는 테이블이 갖추어야 할 몇 가지 정보와 속성들을 정의할 수 있다.

  • 새로운 테이블의 이름
  • 테이블이 위치할 데이터베이스
  • 테이블 내의 각 칼럼의 이름
  • 각 칼럼의 데이터 타입
  • 디폴트 값이 필요한 칼럼에는 디폴트 값 정의
  • collating sequece를 정의[^1]
  • 필요에 따라 원시 키(PRIMARY KEY)를 정의할 수 있다.
  • 테이블에 대한 제한을 걸 수 있다, UNIQUE, NOT NULL, CHECK, FOREIGN KEY 등이 있다.

이러한 내용들을 바탕으로 CREATE TABLE 문의 구조는 다음과 같다. [ .. ] 내부의 내용은 선택적으로 쓰는 것이며, 구문은 순서대로 끊어서 나열했다.

  1. CREATE [TEMP|TEMPORY] TABLE : 테이블을 만든다.
  2. [IF NOT EXISTS] : 해당 이름의 테이블이 없을 때만 실행되도록 한다. 참고로 중복된 테이블 명을 쓰면 에러가 난다.
  3. {테이블 명}
  4. ( {칼럼 정의...} [{테이블 제약...}] ) : 테이블 스키마를 정의한다.
  5. [WITHOUT  ROWID] : 이 옵션을 주면 Row ID를 생성하지 않는다.
  6. AS {select 구문} : 4번과 같이 정의하는 것이 아니라, SELECT 구문의 결과를 테이블로 생성해버린다.

칼럼 정의

칼럼의 정의는 칼럼이름 [타입] [칼럼제약...] 으로 이루어진다. 놀랍게도 SQLite에서 각 테이블 칼럼은 실질적으로는 타입을 갖지 않는 동적 타입이다.

칼럼 제약은 다음과 같은 것들이 있다.

  1. PRIMARY KEY [ASC|DESC] [AUTOINCREMENT] : 해당 칼럼을 원시키로 사용한다.
  2. NOT NULL :  NULL 값을 가질 수 없다.
  3. UNIQUE : 테이블 내에서 고유한 값을 가져야한다. 복수 칼럼이 유니크하는 경우에는 그 조합이 유니크한지를 검사한다.
  4. CHECK ( 표현식 ) : 값이 제한 조건을 만족하도록 한다.
  5. DEFAULT {값}|{숫자}|({표현식}) : INSERT 시 값이 주어지지 않는 경우 디폴트값.
  6. COLLATE 이름 : 대소비교 방법

칼럼은 기본적으로 NULL의 디폴트 값을 갖는다. 물론 이것은 암시적으로 DEFAULT NULL 이 선언된 것으로 봐야 하며, 명시적인 선언도 가능하다.

만약, 특정 칼럼의 디폴트 값이 다른 칼럼의 값과 동일하게 하려면, 이는 트리거를 이용해서 정의해야 한다.

생성된 테이블을 제거하려면 DROP TABLE... 구문을 사용한다

 

임시테이블

임시 테이블은 영속적으로 사용되지 않고 해당 세션동안만 유지되는 테이블이다. 간혹 캐시를 위해서 임시테이블을 만드는 경우가 있는데, SQLite는 인메모리 데이터베이스를 지원하므로 이런 경우 메모리 내에 임시테이블을 만들 수도 있다. SQLite는 변수 선언을 정의하지 않기 때문에, 변수를 위한 용도로 임시테이블을 만들 곤 한다.

임시테이블은 기본적으로 파일에 생성되는데, 메모리에 임시테이블을 만들기 위해서는 temp_store 라는 PRAGMA 세팅값을 변경해야 한다.

PRAGMA temp_store = 2;

이렇게 해두면 임시 테이블이 메모리상에서만 생성된다.