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
策略也可用。此策略會為目標資料庫使用的每個資料表空間,在預寫日誌中寫入一個小記錄。每個這樣的記錄代表將整個目錄複製到檔案系統層級的新位置。雖然這確實大大減少了預寫日誌量,特別是如果範本資料庫很大,但它也強制系統在新資料庫建立之前和之後執行檢查點。在某些情況下,這可能會對整體系統效能產生明顯的負面影響。
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
。
其他的本地化設定,例如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
的設定。本地化設定提供者必須為 builtin
。預設值為指定的 locale
設定,如果未指定,則與範本資料庫的設定相同。
builtin
提供者可用的本地化設定為 C
和 C.UTF-8
。
icu_locale
#指定資料庫預設排序規則和字元分類的 ICU 本地化設定(請參閱第 23.2.2.3.2 節),覆寫 locale
的設定。本地化設定提供者必須為 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
陳述式。 資料庫相當於目錄,其建立是實作定義的。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。