CREATE DATABASE — 建立一個新資料庫
CREATE DATABASEname
[ 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_COLLATE
和 LC_CTYPE
。預設值與模板資料庫的設定相同。有關詳細資訊,請參閱 第 23.2.2.3.1 節 和 第 23.2.2.3.2 節。
可以透過單獨設定 lc_collate
、lc_ctype
、builtin_locale
或 icu_locale
來覆蓋此設定。
如果 locale_provider
是 builtin
,則必須指定 locale
或 builtin_locale
並將其設定為 C
、C.UTF-8
或 PG_UNICODE_FAST
。
其他區域設定 lc_messages、lc_monetary、lc_numeric 和 lc_time 不是資料庫級別的固定設定,並且不透過此命令進行設定。如果您想為特定資料庫設定它們作為預設值,您可以使用 ALTER DATABASE ... SET
。
lc_collate
#在資料庫伺服器的作業系統環境中設定 LC_COLLATE
。預設值是 locale
的設定(如果已指定),否則與模板資料庫的設定相同。有關其他限制,請參閱下文。
如果 locale_provider
是 libc
,則還會設定新資料庫中使用的預設排序順序,覆蓋 locale
的設定。
lc_ctype
#在資料庫伺服器的作業系統環境中設定 LC_CTYPE
。預設值是 locale
的設定(如果已指定),否則與模板資料庫的設定相同。有關其他限制,請參閱下文。
如果 locale_provider
是 libc
,則還會設定新資料庫中使用的預設字元分類,覆蓋 locale
的設定。
builtin_locale
#為資料庫預設排序順序和字元分類指定內建提供程式區域設定,覆蓋 locale
的設定。locale provider 必須是 builtin
。預設值是 locale
的設定(如果已指定);否則與模板資料庫的設定相同。
可用於 builtin
提供程式的區域設定包括 C
、C.UTF-8
和 PG_UNICODE_FAST
。
icu_locale
#為資料庫預設排序順序和字元分類指定 ICU 區域設定(參見 第 23.2.2.3.2 節),覆蓋 locale
的設定。locale provider 必須是 ICU。預設值是 locale
的設定(如果已指定);否則與模板資料庫的設定相同。
icu_rules
#指定用於自定義此資料庫預設排序行為的附加排序規則。僅支援 ICU。有關詳細資訊,請參閱 第 23.2.3.4 節。
locale_provider
#指定此資料庫中預設排序使用的提供程式。可能的值包括 builtin
、icu
(如果伺服器使用 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_COLLATE
和 LC_CTYPE
)相容。如果區域設定為 C
(或等效的 POSIX
),則允許所有編碼,但對於其他區域設定,只有一種編碼可以正常工作。(但在 Windows 上,UTF-8 編碼可以與任何區域設定一起使用。) CREATE DATABASE
允許超級使用者指定 SQL_ASCII
編碼,而不考慮區域設定,但這種選擇已被棄用,如果資料庫中儲存了與區域設定不相容的資料,可能會導致字串函式行為不正確。
編碼和區域設定必須與模板資料庫匹配,除非使用 template0
作為模板。這是因為其他資料庫可能包含與指定編碼不匹配的資料,或者可能包含其排序順序受 LC_COLLATE
和 LC_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
語句。資料庫等同於目錄,其建立是實現定義的。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。