테이블 기본

테이블 기본 (Table Basics)

관계형 데이터베이스의 테이블은 마치 종이에 그린 표와 비슷해요. 행과 열로 이루어져 있고, 열의 개수와 순서는 고정되어 있으며 각 열에는 이름이 붙어요. 반면 행의 개수는 저장된 데이터 양에 따라 계속 변하죠. 이 절에서는 테이블을 만들고, 열의 데이터 타입을 정하고, 필요 없어진 테이블을 지우는 기본기를 다뤄볼게요.

출처: 공식문서

테이블이란 무엇인가

SQL은 테이블 안에서 행의 순서에 대해 아무 보장도 하지 않아요. 테이블을 읽을 때 별도로 정렬을 요청하지 않으면 행은 지정되지 않은 순서로 나오죠. 정렬은 7장에서 다루는 내용이고요. 또 SQL은 행에 고유 식별자를 부여하지 않기 때문에, 완전히 똑같은 행이 여러 개 존재할 수도 있어요. 이것은 SQL의 기반이 되는 수학적 모델의 결과이지만, 실제로는 바람직하지 않은 경우가 많죠. 이 문제를 어떻게 해결하는지는 5장 뒷부분에서 살펴봐요.

열의 데이터 타입

각 열에는 데이터 타입이 있어요. 데이터 타입은 그 열에 넣을 수 있는 값의 범위를 제약하고, 저장된 데이터에 의미를 부여해서 계산에 사용할 수 있게 해줘요. 예를 들어 숫자형으로 선언된 열에는 임의의 문자열을 넣을 수 없고, 그 열에 저장된 데이터로 수학 계산을 할 수 있어요. 반대로 문자형으로 선언된 열은 거의 어떤 데이터든 받아들이지만, 수학 계산보다는 문자열 결합 같은 연산에 적합하죠.

PostgreSQL은 대부분의 애플리케이션에 맞는 상당히 많은 내장 데이터 타입을 제공하고, 사용자가 직접 데이터 타입을 정의할 수도 있어요. 자주 쓰는 것 몇 가지만 짚어볼게요.

  • integer — 정수
  • numeric — 소수를 포함할 수 있는 숫자
  • text — 문자열
  • date — 날짜
  • time — 하루 중의 시각
  • timestamp — 날짜와 시각을 모두 담는 값

CREATE TABLE로 테이블 만들기

테이블을 만들 때는 이름 그대로의 CREATE TABLE 명령을 사용해요. 이 명령에서 최소한 새 테이블 이름, 열 이름들, 그리고 각 열의 데이터 타입을 지정해야 해요. 예를 들어:

CREATE TABLE my_first_table (
    first_column text,
    second_column integer
);

이 명령은 my_first_table이라는 테이블을 두 개의 열로 만들어요. 첫 번째 열은 first_column이라는 이름에 text 타입이고, 두 번째 열은 second_column이라는 이름에 integer 타입이에요. 테이블과 열 이름은 4.1.1절에서 설명하는 식별자 규칙을 따르고, 타입 이름도 대개 식별자지만 몇 가지 예외가 있어요. 열 목록은 쉼표로 구분하고 괄호로 감싼다는 점도 기억해두세요.

물론 앞의 예시는 좀 작위적이었죠. 보통은 테이블과 열에 저장하는 데이터를 드러내는 이름을 붙여요. 좀 더 현실적인 예시를 볼게요:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

(numeric 타입은 화폐 금액처럼 전형적으로 나타나는 소수 부분을 저장할 수 있어요.)

작은 팁: 이름 짓기 규칙

서로 연관된 테이블을 많이 만들 때는 테이블과 열에 일관된 이름 패턴을 정하는 것이 현명해요. 예를 들어 테이블 이름에 단수 명사를 쓸지 복수 명사를 쓸지 선택할 수 있는데, 어떤 이론가든 둘 다 지지하죠.

테이블의 열 개수 제한

테이블이 가질 수 있는 열 개수에는 제한이 있어요. 열 타입에 따라 250개에서 1600개 사이랍니다. 하지만 이 정도 개수에 가까운 테이블을 정의하는 것은 극히 이례적이고, 종종 좋지 않은 설계이기도 해요.

DROP TABLE로 테이블 지우기

더 이상 필요 없는 테이블은 DROP TABLE 명령으로 제거할 수 있어요:

DROP TABLE my_first_table;
DROP TABLE products;

존재하지 않는 테이블을 지우려 하면 오류가 나요. 그런데 SQL 스크립트 파일에서는 테이블을 만들기 전에 오류 메시지를 무시하면서 무조건 지우기를 시도하는 것이 흔한 관례예요. 그래야 테이블이 있든 없든 스크립트가 동작하니까요. 원한다면 DROP TABLE IF EXISTS 변형을 써서 오류 메시지를 피할 수도 있는데, 이건 표준 SQL은 아니에요.

이미 존재하는 테이블을 수정해야 한다면 이 장의 5.7절을 참고하세요.

정리

지금까지 다룬 도구만으로도 완전히 동작하는 테이블을 만들 수 있어요. 이 장의 나머지 부분에서는 테이블 정의에 데이터 무결성, 보안, 편의성을 더하는 기능들을 다룹니다. 지금 바로 데이터를 채우고 싶다면 6장으로 건너뛰고, 나중에 다시 돌아와 이 장을 읽어도 좋아요.

더 알아보기 (Learn more)