SQLite 테이블 생성, 변경, 삭제 방법 3가지

SQLite DB를 생성했다면, 이제 테이블을 만들어서 활용해야겠죠? SQLite 테이블 생성, 변경, 삭제하는 방법 3가지를 모두 확인해 보겠습니다. 그리고 SQLite에서 이용하는 동적 데이터타입과 엄격한 데이터타입 적용 방법도 함께 살펴보겠습니다.

SQLite 테이블 생성

기본적인 테이블 생성 문법은 아래와 같습니다. 기본 테이블 생성 문법을 이용하면 동적 데이터타입이 적용됩니다.

CREATE TABLE 테이블명 (
  필드명1 데이터타입1,
  필드명2 데이터타입2,
  ...
  필드명n 데이터타입n,
);
SQL

동적 데이터타입 적용

대부분의 SQL은 엄격하게 data type을 제한합니다. 그동안 그래왔기 때문에 SQL을 사용하는 수많은 사용자들은 정적이고 엄격한 data type을 이용하는 것을 당연하다고 생각해 왔을 것입니다. 그래서 아마 SQLite의 유연한 동적 data type 체계를 버그라고 생각할 수도 있습니다.

하지만, 이는 버그가 아닙니다. 실제 데이터가 데이터 유형과 꼭 맞지 않는 경우도 생길 수 있기 때문에, 유연한 data type을 지원하고 있습니다. 즉, SQLite은 기본적으로 동적 데이터타입 체계를 사용하기 때문에, 데이터타입을 엄격하게 제한하지 않습니다. 따라서 기존의 엄격하게 데이터유형이 지정된 데이터베이스에서는 불가능했던 작업을 수행할 수 있습니다.

엄격한(STRICT) 정적 데이터타입 적용

SQLite 버전 3.37.0(2021년 11월 27일 배포판)부터는 SQLite에서 엄격한 data type을 적용하기 원하는 경우에는 이를 적용할 수 있습니다. 바로 CREATE TABLE 구문 제일 뒤에 STRICT를 붙여주는 것입니다.

CREATE TABLE 테이블명 (
  필드명1 데이터타입1,
  필드명2 데이터타입2,
  ...
  필드명n 데이터타입n,
) STRICT;
SQL

그럼 STRICT가 잘 작동하는지 확인해 보겠습니다.

CREATE TABLE user (
  id int,
  name string
) STRICT;
SQL

SQLite의 문자열 데이터 타입은 text로 사용하고 있습니다. string은 잘못된 데이터 타입이기 때문에 아래와 같은 오류 메시지를 보여 줍니다.

그림 1. 데이터타입 이름으로 str이 잘못됐음을 알려주는 오류 메시지
그림 1. 데이터타입 이름으로 str이 잘못됐음을 알려주는 오류 메시지

일단 오류를 바로잡은 테이블을 만들어 보겠습니다.

CREATE TABLE user (
  id int,
  name text
) STRICT;
SQL

테이블이 잘 생성됐는지, .schema 명령을 사용해서 확인해 보겠습니다.

그림 2. 정적 데이터타입이 적용된 SQLite 테이블 생성 결과
그림 2. 정적 데이터타입이 적용된 SQLite 테이블 생성 결과

테이블을 생성했으니까, 엄격한 데이터 타입에 위배되는 INSERT문을 사용해 보도록 하겠습니다.

INSERT INTO user (id, name) VALUES ('kim', 1234);
SQL

바로 아래와 같이 데이터타입을 엄격하게 적용해서 맞지 않는 데이터를 저장할 수 없도록 막아주고 있습니다.

그림 3. TEXT 데이터타입의 값을 INT 컬럼에 저장할 수 없음을 알려주는 오류 메시지
그림 3. TEXT 데이터타입의 값을 INT 컬럼에 저장할 수 없음을 알려주는 오류 메시지

테이블 변경

테이블명 변경

먼저 테이블 이름을 변경해 보도록 하겠습니다. 위에서 만들 user 테이블을 users로 변경해 보겠습니다. 테이블 이름이 잘 변경된다면 어떠한 오류 메시지도 없이 SQLite Shell을 만나게 됩니다.

ALTER TABLE user RENAME TO users;
SQL

컬럼명 변경

테이블을 만들어 이용하다가 컬럼이름을 바꿔야 할 때가 있습니다. 그럴 땐 ‘RENAME COLUMN 바꿀 컬럼명 TO 새로운 컬럼명’과 같은 형식으로 사용하면 됩니다. 저는 name 컬럼을 username 컬럼으로 변경해 보겠습니다.

ALTER TABLE users RENAME COLUMN name TO username;
SQL

아래의 결과와 같이 name이 username으로 변경된 것을 확인할 수 있습니다.

그림 3. 컬럼명 변경하는 RENAME COLUMN 적용 및 테이블 스키마 변경 확인
그림 3. 컬럼명 변경하는 RENAME COLUMN 적용 및 테이블 스키마 변경 확인

새로운 컬럼 추가

해당 테이블에 새로운 데이터를 추가하게 되어서 컬럼을 새로 추가해야 하는 경우가 있습니다. 새로운 컬럼을 추가할 때에는 ‘ADD COLUMN 컬럼명 데이터타입’의 형식으로 입력해 주면 됩니다. 저는 아래에서 컬럼명 age, 데이터타입 int로 새로운 컬럼을 추가해 보겠습니다.

ALTER TABLE users ADD COLUMN age int;
SQL

테이블 구조를 확인해 보면 컬럼 제일 뒤에 age int가 추가된 것을 확인할 수 있습니다.

그림 4. 새로운 컬럼 추가하는 ADD COLUMN 구문 적용 및 스키마 변경 확인
그림 4. 새로운 컬럼 추가하는 ADD COLUMN 구문 적용 및 스키마 변경 확인

컬럼 삭제

사용하던 컬럼이 필요없어져서 삭제를 해야 하는 경우가 있습니다. 그럴 땐 ‘DROP COLUMN 컬럼명’의 형식으로 사용하면 됩니다. 저는 age 컬럼을 삭제해 보도록 하겠습니다.

ALTER TABLE users DROP COLUMN age;
SQL

테이블 스키마를 확인해 보면 마지막에 추가했던 컬럼 age가 사라진 것을 확인할 수 있습니다.

그림 5. 컬럼을 삭제하는 DROP COLUMN 구문 적용 및 테이블 스키마 변경 확인
그림 5. 컬럼을 삭제하는 DROP COLUMN 구문 적용 및 테이블 스키마 변경 확인

테이블 삭제

필요없어진 테이블은 삭제해 주어야 합니다. 테이블 삭제는 DROP TABLE 구문을 이용합니다. 여기에서는 지금까지 작업해 온 users 테이블을 삭제해 보겠습니다.

DROP TABLE users;
SQL

테이블을 삭제하고 나면 아래와 같이 .tables나 .schema 구문을 이용했을 때 아무것도 나오지 않습니다.

그림 6. 테이블 삭제 후 .tables와 .schema 명령어로 조회한 경우
그림 6. 테이블 삭제 후 .tables와 .schema 명령어로 조회한 경우

관련 자료

SQLite 홈페이지의 Datatypes In SQLite 문서STRICT Tables 문서 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment