本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CREATE DATABASE
建立新的資料庫。
若要建立資料庫,您必須是超級使用者或具有 CREATEDB 權限。若要建立與零 ETL 整合相關聯的資料庫,您必須是超級使用者或同時擁有 CREATEDB 和 CREATEUSER 權限。
您無法在交易區塊 (BEGIN ... END) 中執行 CREATE DATABASE。如需交易的相關資訊,請參閱 可序列化隔離。
語法
CREATE DATABASE database_name [ { [ FROM INTEGRATION '<integration_id>'[ DATABASE '<source_database>' ] [ SET ] [ ACCEPTINVCHARS [=] { TRUE | FALSE }] [ QUERY_ALL_STATES [=] { TRUE | FALSE }] [ REFRESH_INTERVAL <interval> ] [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ] [ HISTORY_MODE [=] {TRUE | FALSE} ] ] [ WITH ] [ OWNER [=] db_owner ] [ CONNECTION LIMIT { limit | UNLIMITED } ] [ COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE } ] [ ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT } ] } | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } } } | { IAM_ROLE {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } } | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid } ]
參數
- database_name
-
新資料庫的名稱。如需有效名稱的相關資訊,請參閱 名稱與識別碼。
- FROM INTEGRATION '<integration_id>' 【 DATABASE '<source_database>' 】
-
指定是否使用零 ETL 整合識別符建立資料庫。您可以從
integration_id
SVV_INTEGRATION 系統檢視擷取 。對於 Aurora PostgreSQL 零 ETL 整合,您也需要指定名稱,該source_database
名稱也可以從 SVV_INTEGRATION 擷取。如需範例,請參閱「建立資料庫以接收零 ETL 整合的結果」。如需使用零 ETL 整合建立資料庫的詳細資訊,請參閱《Amazon Redshift 管理指南》中的在 Amazon Redshift 中建立目的地資料庫。
- SET
-
選用的關鍵字。
- ACCEPTINVCHARS 【=】 { TRUE | FALSE }
-
當偵測到 VARCHAR 資料類型的字元無效時,ACCEPTINVCHARS 子句會設定零 ETL 整合資料表是否繼續擷取。遇到無效字元時,無效字元會取代為預設
?
字元。 - QUERY_ALL_STATES 【=】 { TRUE | FALSE }
-
QUERY_ALL_STATES 子句會設定是否可以在所有狀態 (
Synced
、、Failed
ResyncRequired
和 ) 中查詢零 ETL 整合資料表ResyncInitiated
。根據預設,零 ETL 整合資料表只能在Synced
狀態中查詢。 - REFRESH_INTERVAL <interval>
-
REFRESH_INTERVAL 子句會設定大約的時間間隔,以秒為單位,將資料從零 ETL 來源重新整理至目標資料庫。對於來源類型為 Aurora MySQL、Aurora PostgreSQL 或 RDS for MySQL 的零 ETL 整合,此值可以設定為 0–432,000 秒 (5 天)。對於 Amazon DynamoDB 零 ETL 整合,該值可以設定為 900–432,000 秒 (15 分鐘 – 5 天)。對於來源類型
interval
為 Aurora MySQL、Aurora PostgreSQL 或 RDS for MySQL 的零 ETL 整合,預設值為零 (0) 秒。對於 Amazon DynamoDB 零 ETL 整合,預設值interval
為 900 秒 (15 分鐘)。 - TRUNCATECOLUMNS 【=】 { TRUE | FALSE }
-
當 VARCHAR 資料欄的值超過限制時,TRUNCATECOLUMNS 子句會設定零 ETL 整合資料表是否繼續擷取。當
TRUE
值被截斷以符合資料欄時。 - HISTORY_MODE 【=】 {TRUE | FALSE}
-
子句,指定 Amazon Redshift 是否會為指定資料庫中的所有新資料表設定歷史記錄模式。此選項僅適用於為零 ETL 整合建立的資料庫。
HISTORY_MODE 子句可以設定為
TRUE
或FALSE
。預設值為FALSE
。如需有關 HISTORY_MODE 的資訊,請參閱《Amazon Redshift 管理指南》中的歷史記錄模式。 - WITH
-
選用的關鍵字。
- OWNER 【=】 db_owner
-
指定資料庫擁有者的使用者名稱。
- CONNECTION LIMIT { limit | UNLIMITED }
-
允許使用者同時開啟的資料庫連線數目上限。超級使用者不受此限制規範。使用 UNLIMITED 關鍵字可允許同時連線的最大數目。另外也可能限制每位使用者的連線數目。如需詳細資訊,請參閱CREATE USER。預設值為 UNLIMITED。若要檢視目前連線數目,請查詢 STV_SESSIONS 系統畫面。
注意
如果同時套用使用者和資料庫連線數目限制,則必須在使用者嘗試連線時,在不超過這兩項限制的情況下提供一個未使用的連線位置。
- COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE }
-
指定字串搜尋或比較是 CASE_SENSITIVE 或 CASE_INSENSITIVE 的子句。預設值為 CASE_SENSITIVE。
- ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT }
-
指定對資料庫執行查詢時所用隔離層級的子句。
-
SERIALIZABLE 隔離 – 提供並行交易的完整序列化功能。如需詳細資訊,請參閱可序列化隔離。
-
SNAPSHOT 隔離 – 提供隔離層級,可避免更新和刪除衝突。這是佈建叢集或無伺服器命名空間中建立的資料庫的預設值。
您可以檢式資料庫正在執行的並行模型,如下所示:
-
查詢 STV_DB_ISOLATION_LEVEL 目錄檢視。如需詳細資訊,請參閱STV_DB_ISOLATION_LEVEL。
SELECT * FROM stv_db_isolation_level;
-
查詢 PG_DATABASE_INFO 檢視。
SELECT datname, datconfig FROM pg_database_info;
每個資料庫的隔離層級都會顯示在
concurrency_model
索引鍵旁邊。值為1
表示 SNAPSHOT。值為2
表示 SERIALIZABLE。
在 Amazon Redshift 資料庫中,SERIALIZABLE 和 SNAPSHOT 隔離都是可序列化隔離層級的類型。也就是說,根據 SQL 標準,不允許已變更讀取、不可重複讀取和幽靈讀取。這兩個隔離層級可保證在交易開始時,交易可在存在之資料的快照上操作,而且其他交易都不能變更該快照。但是,SNAPSHOT 隔離不提供完整的序列化,因為其不會防止在不同的資料表資料列上發生寫入偏差插入和更新。
下列案例說明使用 SNAPSHOT 隔離層級的寫入偏差更新。名為
Numbers
的資料表包含名為digits
的資料欄,其中包含0
和1
值。每個使用者的 UPDATE 陳述式都不會與其他使用者重疊。但是,0
和1
值會交換。他們執行的 SQL 會遵循此時間表,結果如下:時間 使用者 1 動作 使用者 2 動作 1 BEGIN; 2 BEGIN; 3 SELECT * FROM Numbers; digits ------ 0 1
4 SELECT * FROM Numbers; digits ------ 0 1
5 UPDATE Numbers SET digits=0 WHERE digits=1; 6 SELECT * FROM Numbers; digits ------ 0 0
7 COMMIT; 8 Update Numbers SET digits=1 WHERE digits=0; 9 SELECT * FROM Numbers; digits ------ 1 1
10 COMMIT; 11 SELECT * FROM Numbers; digits ------ 1 0
12 SELECT * FROM Numbers; digits ------ 1 0
如果使用可序列化隔離執行相同的案例,Amazon Redshift 會因為可序列化違規而終止使用者 2,並傳回錯誤
1023
。如需詳細資訊,請參閱如何修正可序列化隔離錯誤。在這種情況下,只有使用者 1 可以成功提交。並非所有工作負載都需要要求可序列化隔離,在這種情況下,快照隔離就足以成為資料庫的目標隔離層級。 -
- 從 ARN '<ARN>'
-
用來建立 AWS Glue 資料庫的資料庫 ARN。
- { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA }
-
注意
只有當您的 CREATE DATABASE 命令也使用 FROM ARN 參數時,此參數才適用。
指定是否使用結構描述建立資料庫,以協助存取 AWS Glue Data Catalog中的物件。
- IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::
<AWS 帳戶-id>
:role/<role-name>
' } -
注意
只有當您的 CREATE DATABASE 命令也使用 FROM ARN 參數時,此參數才適用。
如果您在執行 CREATE DATABASE 命令時指定與叢集關聯的 IAM 角色,當您在資料庫上執行查詢時,Amazon Redshift 將會使用該角色的登入資料。
指定
default
關鍵字表示使用設定為預設值且與叢集相關聯的 IAM 角色。如果您使用聯合身分連線到 Amazon Redshift 叢集,並從使用此命令建立的外部結構描述存取資料表,請使用
'SESSION'
。如需使用聯合身分的範例,請參閱使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取,其中會說明如何設定聯合身分。對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。IAM 角色最少須具有在所要存取的 Amazon S3 儲存貯體上執行 LIST 操作,以及在儲存貯體包含的 Amazon S3 物件上執行 GET 操作的許可。若要進一步了解如何在使用 建立資料庫 AWS Glue Data Catalog 進行資料共用時使用 IAM_ROLE,請參閱以取用者身分使用 Lake Formation 管理的資料共用。
以下顯示單一 ARN 的 IAM_ROLE 參數字串語法。
IAM_ROLE 'arn:aws:iam::
<aws-account-id>
:role/<role-name>
'您可以鏈結角色,以便您的叢集可以擔任其他 IAM 角色 (可能屬於其他帳戶)。您最多可以鏈結 10 個角色。如需詳細資訊,請參閱在 Amazon Redshift Spectrum 中鏈結 IAM 角色。
對於此 IAM 角色,請附加與以下內容相似的 IAM 許可政策。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessSecret", "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "arn:aws:secretsmanager:
us-west-2
:123456789012
:secret:my-rds-secret-VNenFy" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "secretsmanager:GetRandomPassword", "secretsmanager:ListSecrets" ], "Resource": "*" } ] }如需建立 IAM 角色以搭配聯合查詢使用的步驟,請參閱建立秘密和 IAM 角色來使用聯合查詢。
注意
不要在鏈結的角色清單中包含空格。
以下顯示鏈結三個角色的語法。
IAM_ROLE 'arn:aws:iam::
<aws-account-id>
:role/<role-1-name>
,arn:aws:iam::<aws-account-id>
:role/<role-2-name>
,arn:aws:iam::<aws-account-id>
:role/<role-3-name>
'
搭配資料共用使用 CREATE DATABASE 的語法
下列語法說明 CREATE DATABASE 命令,用於從資料共用建立資料庫,以在相同 AWS 帳戶中共用資料。
CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid
下列語法說明 CREATE DATABASE 命令,用於從資料共用建立資料庫,以在 AWS 帳戶間共用資料。
CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF ACCOUNT account_id NAMESPACE namespace_guid
搭配資料共用使用 CREATE DATABASE 的參數
- FROM DATASHARE
-
指出資料共用所在位置的關鍵字。
- datashare_name
-
建立取用者資料庫所用的資料共用名稱。
- WITH PERMISSIONS
-
指定從資料共用建立的資料庫需要物件層級權限,才能存取個別資料庫物件。如果沒有這個子句,被授予資料庫 USAGE 權限的使用者或角色,就會自動擁有資料庫中所有資料庫物件的存取權。
- NAMESPACE namespace_guid
-
指定資料共用所屬之生產者命名空間的值。
- ACCOUNT account_id
-
指定資料共用所屬之生產者帳戶的值。
用於資料共用的 CREATE DATABASE 使用說明
身為資料庫超級使用者,當您使用 CREATE DATABASE 從 AWS 帳戶中的資料共用建立資料庫時,請指定 NAMESPACE 選項。ACCOUNT 是選用選項。當您使用 CREATE DATABASE 從跨 AWS 帳戶的資料共用建立資料庫時,請指定來自生產者的 ACCOUNT 和 NAMESPACE。
您只能為取用者叢集上的一個資料共用建立一個取用者資料庫。您無法建立參照相同資料共用的多個取用者資料庫。
從 建立資料庫 AWS Glue Data Catalog
若要使用資料庫 ARN 建立 AWS Glue 資料庫,請在 CREATE DATABASE 命令中指定 ARN。
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA;
或者,您也可以為 IAM_ROLE 參數提供值。如需參數和接受值的相關資訊,請參閱參數。
以下是示範如何使用 IAM 角色從 ARN 建立資料庫的範例。
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE <iam-role-arn>
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE default;
您也可以使用 DATA CATALOG SCHEMA 建立資料庫。
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH DATA CATALOG SCHEMA <sample_schema> IAM_ROLE default;
建立資料庫以接收零 ETL 整合的結果
若要使用零 ETL 整合身分建立資料庫,請在 CREATE DATABASE 命令integration_id
中指定 。
CREATE DATABASE
destination_db_name
FROM INTEGRATION 'integration_id
';
例如,首先,從 SVV_INTEGRATION 擷取整合 ID;
SELECT integration_id FROM SVV_INTEGRATION;
然後使用擷取的其中一個整合 ID 來建立接收零 ETL 整合的資料庫。
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111';
需要零 ETL 整合來源資料庫時,例如指定 。
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' DATABASE 'sourcedb';
您也可以設定資料庫的重新整理間隔。例如,若要將來自零 ETL 整合來源的資料重新整理間隔設定為 7,200 秒:
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
查詢 SVV_INTEGRATION 目錄檢視以取得零 ETL 整合的相關資訊,例如 integration_id、target_database、source、fresh_interval 等。
SELECT * FROM svv_integration;
下列範例會從與開啟歷史記錄模式的整合中建立資料庫。
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
CREATE DATABASE 限制
Amazon Redshift 會針對資料庫強制執行以下限制:
-
每個叢集最多 60 個使用者定義的資料庫。
-
資料庫名稱最多 127 個位元組。
-
資料庫名稱不能是保留字。
資料庫定序
定序是一組規則,用於定義資料庫引擎如何比較和排序 SQL 中的字元類型資料。不區分大小寫的定序是最常用的定序。Amazon Redshift 使用不區分大小寫的定序來協助從其他資料倉儲進行移轉。透過不區分大小寫定序的原生支援,Amazon Redshift 會繼續使用重要的調整或最佳化方法,例如分佈索引鍵、排序索引鍵或範圍限制掃描。
COLLATE 子句會指定資料庫中所有 CHAR 和 VARCHAR 資料欄的預設定序。如果指定 CASE_INSENSITIVE,則所有 CHAR 或 VARCHAR 資料欄都會使用不區分大小寫的定序。如需有關定序的資訊,請參閱 定序序列。
在不區分大小寫的資料欄中插入或擷取的資料將會保留其原始大小寫。但是所有基於比較的字串操作 (包括排序和分組) 也都不區分大小寫。模式比對操作 (如 LIKE 述詞、類似和規則表達式函數) 也不區分大小寫。
下列 SQL 操作支援適用的定序語意:
-
比較運算子:=、<>、<、<=、>、>=。
-
LIKE 運算子
-
ORDER BY 子句
-
GROUP BY 子句
-
使用字串比較的彙總函數,例如 MIN、MAX 和 LISTAGG
-
視窗函數,例如 PARTITION BY 子句與 ORDER BY 子句
-
純量函數 greatest() 和 least()、STRPOS()、REGEXP_COUNT()、REGEXP_REPLACE()、REGEXP_INSTR()、REGEXP_SUBSTR()
-
相異子句
-
UNION、INTERSECT 和 EXCEPT
-
IN LIST
對於外部查詢 (包括 Amazon Redshift Spectrum 和 Aurora PostgreSQL 聯合查詢),VARCHAR 或 CHAR 資料欄的定序會與目前的資料庫層級定序相同。
下列範例會查詢 Amazon Redshift Spectrum 資料表:
SELECT ci_varchar FROM spectrum.test_collation WHERE ci_varchar = 'AMAZON'; ci_varchar ---------- amazon Amazon AMAZON AmaZon (4 rows)
如需如何使用資料庫定序建立資料表的資訊,請參閱 CREATE TABLE。
如需 COLLATE 函數的詳細資訊,請參閱 COLLATE 函數。
資料庫定序限制
以下是在 Amazon Redshift 中使用資料庫定序時的限制:
-
所有系統資料表或檢視 (包括 PG 目錄資料表和 Amazon Redshift 系統資料表) 都會區分大小寫。
-
當取用者資料庫和生產者資料庫具有不同的資料庫層級定序時,Amazon Redshift 不支援跨資料庫和跨叢集查詢。
-
Amazon Redshift 在僅限領導節點查詢中不支援不區分大小寫的定序。
下列範例顯示不支援的不區分大小寫查詢,以及 Amazon Redshift 傳送的錯誤:
SELECT collate(usename, 'case_insensitive') FROM pg_user; ERROR: Case insensitive collation is not supported in leader node only query.
-
Amazon Redshift 不支援區分大小寫和不區分大小寫的資料欄之間進行互動,例如比較、函數、聯結或設定操作。
下列範例顯示區分大小寫和不區分大小寫的資料行互動時的錯誤:
CREATE TABLE test (ci_col varchar(10) COLLATE case_insensitive, cs_col varchar(10) COLLATE case_sensitive, cint int, cbigint bigint);
SELECT ci_col = cs_col FROM test; ERROR: Query with different collations is not supported yet.
SELECT concat(ci_col, cs_col) FROM test; ERROR: Query with different collations is not supported yet.
SELECT ci_col FROM test UNION SELECT cs_col FROM test; ERROR: Query with different collations is not supported yet.
SELECT * FROM test a, test b WHERE a.ci_col = b.cs_col; ERROR: Query with different collations is not supported yet.
Select Coalesce(ci_col, cs_col) from test; ERROR: Query with different collations is not supported yet.
Select case when cint > 0 then ci_col else cs_col end from test; ERROR: Query with different collations is not supported yet.
-
Amazon Redshift 不支援 SUPER 類型的定序。不支援在不區分大小寫的資料庫中建立 SUPER 資料欄,也不支援在 SUPER 和不區分大小寫的資料欄之間進行互動。
下列範例會在不區分大小寫的資料庫中建立以 SUPER 做為資料類型的資料表:
CREATE TABLE super_table (a super); ERROR: SUPER column is not supported in case insensitive database.
下列範例會使用與 SUPER 資料進行比較的不區分大小寫字串來查詢資料:
CREATE TABLE test_super_collation (s super, c varchar(10) COLLATE case_insensitive, i int);
SELECT s = c FROM test_super_collation; ERROR: Coercing from case insensitive string to SUPER is not supported.
若要讓這些查詢運作,請使用 COLLATE 函數來轉換一個資料行的定序,以比對另一個資料行。如需詳細資訊,請參閱COLLATE 函數。
範例
建立資料庫
下列範例會建立名為 TICKIT 的資料庫,並將所有權提供給使用者 DWUSER。
create database tickit with owner dwuser;
若要檢視有關資料庫的詳細資訊,請查詢 PG_DATABASE_INFO 目錄資料表。
select datname, datdba, datconnlimit from pg_database_info where datdba > 1; datname | datdba | datconnlimit -------------+--------+------------- admin | 100 | UNLIMITED reports | 100 | 100 tickit | 100 | 100
下列範例會建立名稱為 sampledb
且具有 SNAPSHOT 隔離層級的資料庫。
CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
下列範例會從資料共用 salesshare 中建立資料庫 sales_db。
CREATE DATABASE sales_db FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
資料庫定序範例
建立不區分大小寫的資料庫
下列範例會建立 sampledb
資料庫、建立 T1
資料表,以及將資料插入 T1
資料表。
create database sampledb collate case_insensitive;
連線到您剛才使用 SQL 用戶端建立的新資料庫。使用 Amazon Redshift 查詢編輯器 v2 時,請在編輯器中選擇 sampledb
。使用 RSQL 時,請使用如下所示的命令。
\connect sampledb;
CREATE TABLE T1 ( col1 Varchar(20) distkey sortkey );
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');
然後查詢會尋找包含 John
結果。
SELECT * FROM T1 WHERE col1 = 'John'; col1 ------ john JOHN (2 row)
以不區分大小寫的順序排序
下列範例顯示資料表 T1 的不區分大小寫排序。Bob 和 bob 或 John 和 john 的排序是不確定的,因為其在不區分大小寫的資料欄中是相等的。
SELECT * FROM T1 ORDER BY 1; col1 ------ bob Bob JOHN john Mary (5 rows)
同樣地,下面範例顯示使用 GROUP BY 子句的不區分大小寫排序。Bob 和 bob 是同等的,屬於同一組。結果中會顯示哪一個是不確定的。
SELECT col1, count(*) FROM T1 GROUP BY 1; col1 | count -----+------ Mary | 1 bob | 2 JOHN | 2 (3 rows)
在不區分大小寫的資料欄上使用視窗函數進行查詢
下列範例會在不區分大小寫的資料欄上查詢視窗函數。
SELECT col1, rank() over (ORDER BY col1) FROM T1; col1 | rank -----+------ bob | 1 Bob | 1 john | 3 JOHN | 3 Mary | 5 (5 rows)
使用 DISTINCT 關鍵字進行查詢
下列範例會使用 DISTINCT 關鍵字查詢 T1
資料表。
SELECT DISTINCT col1 FROM T1; col1 ------ bob Mary john (3 rows)
使用 UNION 子句查詢
下列範例顯示資料表 T1
和 T2
UNION 的結果。
CREATE TABLE T2 AS SELECT * FROM T1;
SELECT col1 FROM T1 UNION SELECT col1 FROM T2; col1 ------ john bob Mary (3 rows)