2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 策略也可用。此策略為目標資料庫使用的每個表空間寫入一個小的寫前日誌記錄。每個此類記錄代表在檔案系統級別將整個目錄複製到一個新位置。雖然這大大減少了寫前日誌量,尤其是在模板資料庫很大的情況下,但它還會強制系統在建立新資料庫之前和之後都執行一次檢查點。在某些情況下,這可能會對整體系統效能產生明顯的負面影響。FILE_COPY 策略受 file_copy_method 設定的影響。

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-8PG_UNICODE_FAST

提示

其他區域設定 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 的設定。locale provider 必須是 builtin。預設值是 locale 的設定(如果已指定);否則與模板資料庫的設定相同。

可用於 builtin 提供程式的區域設定包括 CC.UTF-8PG_UNICODE_FAST

icu_locale #

為資料庫預設排序順序和字元分類指定 ICU 區域設定(參見 第 23.2.2.3.2 節),覆蓋 locale 的設定。locale provider 必須是 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 語句。資料庫等同於目錄,其建立是實現定義的。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。