支援的版本: 目前版本 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CREATE DATABASE

CREATE DATABASE — 建立新的資料庫

概要

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ STRATEGY [=] strategy ]
           [ LOCALE [=] locale ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ BUILTIN_LOCALE [=] builtin_locale ]
           [ ICU_LOCALE [=] icu_locale ]
           [ ICU_RULES [=] icu_rules ]
           [ LOCALE_PROVIDER [=] locale_provider ]
           [ COLLATION_VERSION = collation_version ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]
           [ OID [=] oid ]

描述

CREATE DATABASE 會建立一個新的 PostgreSQL 資料庫。

要建立資料庫,您必須是超級使用者或具有特殊的 CREATEDB 權限。請參閱 CREATE ROLE

預設情況下,新的資料庫將會透過複製標準系統資料庫 template1 來建立。您可以透過撰寫 TEMPLATE name 來指定不同的範本。特別是,透過撰寫 TEMPLATE template0,您可以建立一個原始的資料庫(沒有使用者定義的物件存在,並且系統物件尚未被修改),其中僅包含您的 PostgreSQL 版本預定義的標準物件。如果您想避免複製任何可能已新增至 template1 的安裝本地物件,這會很有用。

參數

name #

要建立的資料庫名稱。

user_name #

將擁有新資料庫的使用者的角色名稱,或使用 DEFAULT 來使用預設值(即執行命令的使用者)。要建立另一個角色擁有的資料庫,您必須能夠 SET ROLE 為該角色。

template #

用於建立新資料庫的範本名稱,或使用 DEFAULT 來使用預設範本 (template1)。

encoding #

要在新資料庫中使用的字元集編碼。指定字串常數 (例如,'SQL_ASCII'),或整數編碼號碼,或 DEFAULT 來使用預設編碼(即範本資料庫的編碼)。PostgreSQL 伺服器支援的字元集在 第 23.3.1 節 中描述。 有關其他限制,請參閱下文。

strategy #

建立新資料庫時要使用的策略。如果使用 WAL_LOG 策略,則資料庫將逐塊複製,並且每個塊將單獨寫入預寫日誌。在範本資料庫很小的情況下,這是最有效的策略,因此它是預設策略。舊的 FILE_COPY 策略也可用。此策略會為目標資料庫使用的每個資料表空間,在預寫日誌中寫入一個小記錄。每個這樣的記錄代表將整個目錄複製到檔案系統層級的新位置。雖然這確實大大減少了預寫日誌量,特別是如果範本資料庫很大,但它也強制系統在新資料庫建立之前和之後執行檢查點。在某些情況下,這可能會對整體系統效能產生明顯的負面影響。

locale #

設定新資料庫中的預設校對順序和字元分類。校對會影響套用至字串的排序順序,例如,在使用 ORDER BY 的查詢中,以及文字欄位索引中使用的順序。字元分類會影響字元的分類,例如,小寫、大寫和數字。 此外,還會設定作業系統環境的相關方面,LC_COLLATELC_CTYPE。預設值與範本資料庫的設定相同。 有關詳細資訊,請參閱 第 23.2.2.3.1 節第 23.2.2.3.2 節

可以透過個別設定 lc_collatelc_ctypebuiltin_localeicu_locale 來覆寫。

如果 locale_providerbuiltin,則必須指定 localebuiltin_locale,並將其設定為 CC.UTF-8

提示

其他的本地化設定,例如lc_messageslc_monetarylc_numericlc_time,並非針對每個資料庫固定,且不會由此指令設定。如果您想將它們設為特定資料庫的預設值,您可以使用 ALTER DATABASE ... SET

lc_collate #

設定資料庫伺服器作業系統環境中的 LC_COLLATE。預設值為指定的 locale 設定,如果未指定,則與範本資料庫的設定相同。 請參閱下文了解其他限制。

如果 locale_providerlibc,也會設定要在新資料庫中使用的預設排序規則,覆寫 locale 的設定。

lc_ctype #

設定資料庫伺服器作業系統環境中的 LC_CTYPE。預設值為指定的 locale 設定,如果未指定,則與範本資料庫的設定相同。 請參閱下文了解其他限制。

如果 locale_providerlibc,也會設定要在新資料庫中使用的預設字元分類,覆寫 locale 的設定。

builtin_locale #

指定資料庫預設排序規則和字元分類的內建模組提供者本地化設定,覆寫 locale 的設定。本地化設定提供者必須為 builtin。預設值為指定的 locale 設定,如果未指定,則與範本資料庫的設定相同。

builtin 提供者可用的本地化設定為 CC.UTF-8

icu_locale #

指定資料庫預設排序規則和字元分類的 ICU 本地化設定(請參閱第 23.2.2.3.2 節),覆寫 locale 的設定。本地化設定提供者必須為 ICU。預設值為指定的 locale 設定,如果未指定,則與範本資料庫的設定相同。

icu_rules #

指定額外的排序規則來自訂此資料庫預設排序規則的行為。僅 ICU 支援此功能。詳細資訊請參閱第 23.2.3.4 節

locale_provider #

指定要用於此資料庫中預設排序規則的提供者。可能的值為 builtinicu(如果伺服器在建置時有 ICU 支援)或 libc。預設情況下,提供者與template 的提供者相同。 詳情請參閱第 23.1.4 節

collation_version #

指定要與資料庫一起儲存的排序規則版本字串。 通常,應省略此選項,這將導致根據作業系統提供的資料庫排序規則的實際版本計算版本。 此選項旨在供 pg_upgrade 用於從現有安裝複製版本。

另請參閱 ALTER DATABASE 了解如何處理資料庫排序規則版本不符的情況。

tablespace_name #

要與新資料庫相關聯的資料表空間名稱,或 DEFAULT 以使用範本資料庫的資料表空間。 此資料表空間將是用於在此資料庫中建立的物件的預設資料表空間。 有關更多資訊,請參閱 CREATE TABLESPACE

allowconn #

如果為 false,則沒有人可以連接到此資料庫。 預設值為 true,允許連線(除非受到其他機制的限制,例如 GRANT/REVOKE CONNECT)。

connlimit #

可以與此資料庫建立多少個並行連線。 -1(預設值)表示沒有限制。

istemplate #

如果為 true,則任何具有 CREATEDB 權限的使用者都可以複製此資料庫; 如果為 false(預設值),則只有超級使用者或資料庫的所有者可以複製它。

oid #

要用於新資料庫的物件識別碼。 如果未指定此參數,PostgreSQL 將自動選擇合適的 OID。 此參數主要供 pg_upgrade 內部使用,並且只有 pg_upgrade 可以指定小於 16384 的值。

可選參數可以以任何順序編寫,而不僅僅是上面顯示的順序。

注意事項

CREATE DATABASE 無法在交易區塊內執行。

類似於無法初始化資料庫目錄的錯誤很可能與資料目錄的權限不足、磁碟已滿或其他檔案系統問題有關。

使用 DROP DATABASE 刪除資料庫。

程式 createdb 是此命令的包裝程式,為了方便而提供。

資料庫層級配置參數(透過 ALTER DATABASE 設定)和資料庫層級權限(透過 GRANT 設定)不會從範本資料庫複製。

雖然可以透過指定 template1 以外的資料庫名稱作為範本來複製資料庫,但這並非(尚未)作為通用的 COPY DATABASE 工具。 主要限制是,在複製範本資料庫時,不能有其他連線連到該資料庫。CREATE DATABASE 在啟動時若有其他連線存在,就會失敗;否則,到 CREATE DATABASE 完成前,新的連線都會被鎖定而無法連到範本資料庫。 請參閱第 22.3 節以取得更多資訊。

為新資料庫指定的字元集編碼必須與所選的地區設定(LC_COLLATELC_CTYPE)相容。 如果地區設定為 C(或相當於 POSIX),則允許所有編碼,但對於其他地區設定,只有一種編碼可以正常運作。(但是在 Windows 上,UTF-8 編碼可以與任何地區設定一起使用。)無論地區設定為何,CREATE DATABASE 都允許超級使用者指定 SQL_ASCII 編碼,但此選擇已被棄用,並且如果將與地區設定不相容的資料儲存在資料庫中,可能會導致字串函式的行為異常。

編碼和地區設定必須與範本資料庫的編碼和地區設定相符,除非使用 template0 作為範本。 這是因為其他資料庫可能包含與指定編碼不符的資料,或者可能包含其排序順序受 LC_COLLATELC_CTYPE 影響的索引。 複製此類資料將會產生根據新設定而損毀的資料庫。 然而,已知 template0 不包含任何會受到影響的資料或索引。

目前沒有選項可以使用具有不確定性比較的資料庫地區設定(請參閱 CREATE COLLATION 以取得說明)。 如果需要這樣做,則需要使用每個欄位的定序。

CONNECTION LIMIT 選項僅為大約強制執行;如果當資料庫只剩下一個連線 時,有兩個新的工作階段幾乎同時啟動,則兩個工作階段都可能失敗。 此外,此限制不會強制針對超級使用者或背景工作處理程序執行。

範例

建立新的資料庫

CREATE DATABASE lusiadas;

建立一個名為 sales 的資料庫,其擁有者為使用者 salesapp,預設表格空間為 salesspace

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

建立一個具有不同地區設定的資料庫 music

CREATE DATABASE music
    LOCALE 'sv_SE.utf8'
    TEMPLATE template0;

在此範例中,如果指定的地區設定與 template1 中的地區設定不同,則需要 TEMPLATE template0 子句。(如果相同,則明確指定地區設定是多餘的。)

建立一個具有不同地區設定和不同字元集編碼的資料庫 music2

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

指定的地區設定和編碼設定必須相符,否則會報告錯誤。

請注意,地區設定名稱是特定於作業系統的,因此上述命令可能無法在所有地方以相同的方式運作。

相容性

SQL 標準中沒有 CREATE DATABASE 陳述式。 資料庫相當於目錄,其建立是實作定義的。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。