CREATE DATABASE

CREATE DATABASE — 새 데이터베이스 정의

요약

CREATE DATABASE 이름
    [ [ WITH ] [ OWNER [=] 소유주 ]
           [ TEMPLATE [=] 템플릿 ]
           [ ENCODING [=] 인코딩 ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] 테이블스페이스 ]
           [ ALLOW_CONNECTIONS [=] 접속여부 ]
           [ CONNECTION LIMIT [=] 접속제한수 ]
           [ IS_TEMPLATE [=] 템블릿여부 ] ]

설명

CREATE DATABASE 명령은 PostgreSQL 데이터베이스를 만든다.

슈퍼유저나 CREATEDB 권한이 있는 사용자만 이 명령을 사용할 수 있다. CREATE USER 명령 설명서 참조.

기본적으로 새 데이터베이스 만드는 작업은 template1 데이터베이스를 복사하는 일을 한다. 이 템플릿을 바꾸려면, TEMPLATE 템플릿 구문을 이용해서 특정 데이터베이스를 복사한다. 특별히 TEMPLATE template0 구문을 사용하면, 해당 PostgreSQL 버전의 표준 개체들만 포함되어 있는 완전한 초기 데이터베이스를 복사한다. 이 구문은 template1 데이터베이스에 임의로 만들어둔 개체들을 사용하지 않으려고 할 때 유용하게 쓰인다.

매개 변수

이름

새 데이터베이스 이름.

소유주

해당 데이터베이스 소유주가 될 사용자 이름. DEFAULT로 지정하면, 현재 이 명령을 실행하는 소유주가 새 데이터베이스 소유주가 된다. 자신이 아닌 다른 소유주를 지정한다면, 자신은 직간접적으로 새 소유주나 슈퍼유저의 소속원이여야 한다.

템플릿

템플릿으로 사용할 데이터베이스 이름. 이 값으로 DEFAULT를 지정하면, template1 데이터베이스로 간주한다.

인코딩

새 데이터베이스에서 사용할 문자 세트 인코딩 이름. 'SQL_ASCII'와 같이 문자열 상수로 지정하거나 인코딩 번호를 지정한다. DEFAULT로 지정하면, 템플릿 데이터베이스의 인코딩을 따른다. PostgreSQL에서 사용할 수 있는 인코딩은 23.3.1절에서 설명하고 있다. 추가 제한 사항은 아래 참조.

lc_collate

새 데이터베이스에서 사용할 문자 정렬 규칙(LC_COLLATE)을 지정한다. 이 설정은 문자열 자료의 정렬 순서에 영향을 준다. 예, ORDER BY 쿼리나, 텍스트 칼럼 대상 인덱스 사용. 기본값은 템플릿 데이터베이스의 값을 사용한다. 추가 제한 사항은 아래 참조.

lc_ctype

새 데이터베이스에서 사용할 문자 분류(LC_CTYPE)를 지정한다. 이 설정은 문자 범주 작업에 영향을 준다. 예, 대문자, 소문자, 숫자 범주 처리. 기본값은 템플릿 데이터베이스의 값을 사용한다. 추가 제한 사항은 아래 참조.

테이블스페이스

새 데이터베이스와 연결될 테이블스페이스를 지정한다. DEFAULT로 설정하면, 템플릿 데이터베이스에 지정한 테이블스페이스를 사용한다. 이 테이블스페이스는 해당 데이터베이스의 기본 테이블스페이스가 되어 특별히 따로 테이블스페이스를 지정하지 않고 만드는 모든 개체는 이 테이블스페이스 안에 보관된다. CREATE TABLESPACE 명령 설명서 참조.

접속여부

false로 설정하면, 누구도 해당 데이터베이스로 접속할 수 없다. 기본값은 true로 접속 가능 상태로 지정한다. 이 경우는 GRANT/REVOKE CONNECT 같은 명령으로 접속을 제어할 수 있다.

접속제한수

접속을 허용할 최대 접속 수. -1 (기본값)은 제한 없음.

템블릿여부

true로 설정하면, CREATEDB 권한이 있는 사용자가 이 데이터베이스를 템플릿 데이터베이스로 사용할 있게 된다. false(기본값)로 설정하면, 이 데이터베이스는 슈퍼유저와 이 데이터베이스 소유주만 이 데이터베이스를 템플릿 데이터베이스로 해서 새 데이터베이스를 만들 수 있다.

옵션 성격의 매개 변수들은 그 순서에 상관 없이 사용할 수 있다.

참고

CREATE DATABASE 명령은 트래잭션 영역에서는 사용할 수 없다.

could not initialize database directory 오류가 발생하는 경우가 있는데, 이 때는 대부분 그 디렉터리 쓰기 권한이 없거나 디스크 여유 공간이 없거나, 기타 파일 시스템 문제가 있는 경우다.

DROP DATABASE 명령으로 데이터베이스를 지운다.

createdb 응용 프로그램은 이 SQL 명령을 쉘 명령으로 구현한 것이다.

템플릿 데이터베이스에 설정된 데이터베이스 수준의 환경 설정 매개 변수 값은 복사되지 않는다. (ALTER DATABASE 명령 설명서 참조)

템플릿 데이터베이스로 template1 말고, 다른 데이터베이스를 지정할 수도 있지만, DATABASE 복사 작업을 진행하고 있는 동안에는 그 템플릿 데이터베이스 접속이 제한된다. 또한, 그 템플릿 데이터베이스를 사용하는 접속이 하나라도 있으면, CREATE DATABASE 자체를 시작할 수도 없다. 22.3절 참고

지정한 문자 세트 인코딩은 선택한 로케일 설정(LC_COLLATE, LC_CTYPE)과 호환되어야 한다. 로케일 값으로 C (POSIX와 같음)로 설정하면, 모든 인코딩과 호환된다. 그외 로케일을 설정하면, 그 로케일과 호환되는 인코딩을 사용해야 한다. (반면, 윈도우즈에서는 UTF-8 인코딩인 경우 모든 로케일을 사용할 수 있다.) 슈퍼유저가 SQL_ASCII 인코딩을 사용하는 경우, 임의 로케일을 지정할 있게 허용하기는 하지만, 이 경우, 문자열 조작 함수가 오동작할 경우가 생긴다. 주의 해야 한다.

template0 데이터베이스를 템플릿으로 사용하는 경우를 제외하면, 템플릿 데이터베이스의 인코딩과 로케일 설정을 서로 사용 가능해야 한다. 이렇게 제한하는 이유는 새로 만들어질 데이터베이스 내에 템플릿 데이터베이스에 있던 자료들이 복사 되는데, 이 때, 이 설정이 달라져서 엉뚱한 결과를 초래할 수도 있기 때문이다. 이런 문제를 피하기 위해서는 template0 데이터베이스를 템플릿으로 사용해서 사용할 자료를 아에 복사하지 않으면 된다.

CONNECTION LIMIT 옵션 값은 대략적으로 작동한다. 하나의 세션만 허용할 수 있는 상황에 두 세션이 동시에 접속을 시도하면, 두 세션 모두 여유 슬롯이 없다는 오류가 발생할 수 있다. 한편 슈퍼유저나 백그라운드 작업자 프로세스 접속은 이 제한을 받지 않는다.

예제

새 데이터베이스를 만들 때:

CREATE DATABASE lusiadas;

소유주, 테이블스페이스를 지정해서 새 데이터베이스를 만들 때:

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

임의의 로케일 설정으로 데이터베이스를 만들 때:

CREATE DATABASE music
    LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8'
    TEMPLATE template0;

윗 예제처럼 로케일 관련 설정을 지정하려면, TEMPLATE template0 옵션을 지정해야 한다. template1 템플릿으로는 바꿀 수 없다.

임의의 로케일, 문자 세트 인코딩을 지정해서 데이터베이스를 만들 때:

CREATE DATABASE music2
    LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915'
    ENCODING LATIN9
    TEMPLATE template0;

로케일 설정과 인코딩이 같이 사용할 수 있는 값이여야 한다. 그렇지 않으면, 오류로 처리한다.

로케일 이름은 해당 운영체제에서 결정하기 때문에, 윗 예제에 나오는 값을 그대로 사용하지 못할 수도 있다.

호환성

CREATE DATABASE 구문은 표준 SQL 구문이 아니다. PostgreSQL의 데이터베이스는 표준 SQL의 카탈로그와 같다.

관련 항목

ALTER DATABASE, DROP DATABASE