CREATE DATABASE — 새 데이터베이스 정의
CREATE DATABASE이름
[ [ WITH ] [ OWNER [=]소유주
] [ TEMPLATE [=]템플릿
] [ ENCODING [=]인코딩
] [ LOCALE [=]로케일
] [ LC_COLLATE [=]lc_collate
] [ LC_CTYPE [=]lc_ctype
] [ TABLESPACE [=]테이블스페이스
] [ ALLOW_CONNECTIONS [=]접속여부
] [ CONNECTION LIMIT [=]접속제한수
] [ IS_TEMPLATE [=]템블릿여부
] ]
CREATE DATABASE
명령은
PostgreSQL 데이터베이스를 만든다.
슈퍼유저나 CREATEDB
권한이 있는 사용자만 이 명령을
사용할 수 있다.
CREATE ROLE 명령 설명서 참조.
기본적으로 새 데이터베이스 만드는 작업은 template1
데이터베이스를 복사하는 일을 한다. 이 템플릿을 바꾸려면,
TEMPLATE
구문을 이용해서 특정 데이터베이스를 복사한다.
특별히
템플릿
TEMPLATE template0
구문을 사용하면,
해당 PostgreSQL 버전의 표준
개체들만 포함되어 있는 완전한 초기 데이터베이스
(사용자가 추가한 객체도 없고, 사용자가 변경한 시스템 객체들도 없는)
objects have not been altered)를 복사한다.
이 구문은 template1
데이터베이스에 임의로
만들어둔 개체들을 사용하지 않으려고 할 때 유용하게 쓰인다.
이름
새 데이터베이스 이름.
소유주
해당 데이터베이스 소유주가 될 사용자 이름.
DEFAULT
로 지정하면,
현재 이 명령을 실행하는 소유주가 새 데이터베이스 소유주가 된다.
자신이 아닌 다른 소유주를 지정한다면,
자신은 직간접적으로 새 소유주나 슈퍼유저의 소속원이여야 한다.
템플릿
템플릿으로 사용할 데이터베이스 이름.
이 값으로 DEFAULT
를 지정하면,
template1
데이터베이스로 간주한다.
인코딩
새 데이터베이스에서 사용할 문자 세트 인코딩 이름.
'SQL_ASCII'
와 같이 문자열 상수로
지정하거나 인코딩 번호를 지정한다.
DEFAULT
로 지정하면,
템플릿 데이터베이스의 인코딩을 따른다.
PostgreSQL에서 사용할 수
있는 인코딩은 23.3.1절에서
설명하고 있다. 추가 제한 사항은 아래 참조.
로케일
This is a shortcut for setting LC_COLLATE
and LC_CTYPE
at once. If you specify this,
you cannot specify either of those parameters.
The other locale settings lc_messages, lc_monetary, lc_numeric, and
lc_time are not fixed per database and are not
set by this command. If you want to make them the default for a
specific database, you can use ALTER DATABASE
... SET
.
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 명령과 데이터베이스 수준 접근권한 ( GRANT ) 설명서 참조)
템플릿 데이터베이스로 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 LOCALE 'sv_SE.utf8' TEMPLATE template0;
윗 예제처럼 로케일 관련 설정을 지정하려면,
TEMPLATE template0
옵션을 지정해야 한다.
template1
템플릿으로는 바꿀 수 없다.
임의의 로케일, 문자 세트 인코딩을 지정해서 데이터베이스를 만들 때:
CREATE DATABASE music2 LOCALE 'sv_SE.iso885915' ENCODING LATIN9 TEMPLATE template0;
로케일 설정과 인코딩이 같이 사용할 수 있는 값이여야 한다. 그렇지 않으면, 오류로 처리한다.
로케일 이름은 해당 운영체제에서 결정하기 때문에, 윗 예제에 나오는 값을 그대로 사용하지 못할 수도 있다.
CREATE DATABASE
구문은 표준 SQL 구문이 아니다.
PostgreSQL의 데이터베이스는 표준 SQL의 카탈로그와 같다.