CREATE DATABASE - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CREATE DATABASE

建立新的資料庫。

要創建數據庫,您必須是超級用戶或具有CREATEDB權限。若要建立與零ETL整合相關聯的資料庫,您必須是超級使用者或同時擁有CREATEDB和CREATEUSER權限。

您無法在事務塊CREATEDATABASE中運行(BEGIN... END). 如需交易的相關資訊,請參閱 可序列化隔離

語法

CREATE DATABASE database_name [ { [ WITH ] [ OWNER [=] db_owner ] [ CONNECTION LIMIT { limit | UNLIMITED } ] [ COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE } ] [ ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT } ] } | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF [ ACCOUNT account_id ] NAMESPACE namespace_guid } | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } } | { INTEGRATION '<integration_id>'} } | { IAM_ROLE {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } }

參數

database_name

新資料庫的名稱。如需有效名稱的相關資訊,請參閱 名稱與識別碼

WITH

選用的關鍵字。

OWNER

指定資料庫擁有者。

=

選用字元。

db_owner

資料庫擁有者的使用者名稱。

CONNECTIONLIMIT{限制 |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_ _ 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 的資料欄,其中包含 01 值。每個使用者的UPDATE陳述式不會與其他使用者重疊。但是,01 值會交換。SQL它們運行遵循此時間表的結果如下:

時間 使用者 1 動作 使用者 2 動作
1 BEGIN;
2 BEGIN;
3 SELECT* FROM 數字;
digits
------
0
1
4 SELECT* FROM 數字;
digits
------
0
1
5 UPDATE數字數字 = SET 0 位數字 = WHERE 1;
6 SELECT* FROM 數字;
digits
------
0
0
7 COMMIT;
8 更新SET數字數字 = 1 位數字 = 0; WHERE
9 SELECT* FROM 數字;
digits
------
1
1
10 COMMIT;
11 SELECT* FROM 數字;
digits
------
1
0
12 SELECT* FROM 數字;
digits
------
1
0

如果使用可序列化隔離執行相同的案例,Amazon Redshift 會因為可序列化違規而終止使用者 2,並傳回錯誤 1023。如需詳細資訊,請參閱如何修正可序列化隔離錯誤。在這種情況下,只有使用者 1 可以成功提交。並非所有工作負載都需要要求可序列化隔離,在這種情況下,快照隔離就足以成為資料庫的目標隔離層級。

FROM ARN '<ARN>'

所以此 AWS Glue 用ARN於創建數據庫的數據庫。

{DATACATALOGSCHEMA<schema>'| WITH 沒有 DATA CATALOGSCHEMA}
注意

只有當您的CREATEDATABASE指令也使用參數時,此FROMARN參數才適用。

指定是否使用結構描述來建立資料庫,以協助存取 AWS Glue Data Catalog.

FROMINTEGRATION'<integration_id>'

指定是否使用零ETL整合識別碼建立資料庫。您可以integration_id從 SVV _ INTEGRATION 系統檢視擷取。如需範例,請參閱建立資料庫以接收零ETL整合的結果。如需使用零ETL整合建立資料庫的詳細資訊,請參閱 Amazon Redshift 管理指南中的在 Amazon Redshift 中建立目的地資料庫。

IAM_ ROLE {默認 | '' | SESSION 'ARN:AWN:IAM:<AWS 帳戶-id>:角色/<role-name>' }
注意

只有當您的CREATEDATABASE指令也使用參數時,此FROMARN參數才適用。

如果您在執行CREATEDATABASE命令時指定與叢集關聯的IAM角色,Amazon Redshift 將在您在資料庫上執行查詢時使用該角色的登入資料。

指定關default鍵字表示使IAM用設定為預設值且與叢集相關聯的角色。

如果您使用聯合身分連線到 Amazon Redshift 叢集,並從使用此命令建立的外部結構描述存取資料表,請使用 'SESSION'。如需使用聯合身分的範例,請參閱使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取,其中會說明如何設定聯合身分。

將 Amazon 資源名稱 (ARN) 用於叢集用於身份驗證和授權的IAM角色。至少,IAM角色必須具有在要存取的 Amazon S3 儲存貯體上執行LIST操作的權限,以及在儲存貯體包含的 Amazon S3 物件上執行GET操作。若要進一步瞭解使用建立資料庫ROLE時使用 IAM _ AWS Glue Data Catalog 如需資料儲存體,請參閱以消費者身分使用 Lake 格式化管理的資料傳送方式

以下顯示單一ROLE參數字串 IAM _ 的語法ARN。

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'

您可以鏈結角色,以便叢集可以擔任其他IAM角色,可能屬於另一個帳戶。您最多可以鏈結 10 個角色。如需詳細資訊,請參閱Amazon Redshift Spec IAM trum 中的鏈接角色

對於此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>'

與數據護理一CREATEDATABASE起使用的語法

下面的語法描述了用於從數據相同的共享數據庫創建數據庫的CREATEDATABASE命令 AWS 帳戶。

CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF [ ACCOUNT account_id ] NAMESPACE namespace_guid

下面的語法描述了用於從數據清單創建數據庫的CREATEDATABASE命令,以跨越共享數據 AWS 帳戶。

CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF ACCOUNT account_id NAMESPACE namespace_guid

與資料相關CREATEDATABASE搭配使用的參數

FROM DATASHARE

指出資料共用所在位置的關鍵字。

datashare_name

建立取用者資料庫所用的資料共用名稱。

WITH PERMISSIONS

指定從資料共用建立的資料庫需要物件層級權限,才能存取個別資料庫物件。如果沒有這個子句,被授與資料庫USAGE權限的使用者或角色就會自動擁有資料庫中所有資料庫物件的存取權。

NAMESPACE命名空间

指定資料共用所屬之生產者命名空間的值。

ACCOUNT帳戶

指定資料共用所屬之生產者帳戶的值。

資料分享的CREATEDATABASE使用注意事項

身為資料庫超級使用者,當您使用CREATEDATABASE在 AWS 帳戶中,指定NAMESPACE選項。該ACCOUNT選項是可選的。當您使用跨CREATEDATABASE資料庫建立資料庫時 AWS 帳戶中,指定ACCOUNT和NAMESPACE來自生產者。

您只能為取用者叢集上的一個資料共用建立一個取用者資料庫。您無法建立參照相同資料共用的多個取用者資料庫。

CREATEDATABASE從 AWS Glue Data Catalog

若要使用建立資料庫 AWS Glue 資料庫中ARN,ARN在您的指CREATEDATABASE令中指定。

CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA;

或者,您也可以在 IAM _ ROLE 參數中提供值。如需參數和接受值的相關資訊,請參閱參數

以下是示範如何從 ARN using IAM 角色建立資料庫的範例。

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 CATALOGSCHEMA.

CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH DATA CATALOG SCHEMA <sample_schema> IAM_ROLE default;

建立資料庫以接收零ETL整合的結果

若要使用零ETL整合識別碼建立資料庫,請在指CREATEDATABASE令integration_id中指定。

CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';

例如,首先,從 SVV _ 中檢索集成 IDINTEGRATION;

SELECT integration_id FROM SVV_INTEGRATION;

然後使用擷取的其中一個整合 ID 來建立接收零ETL整合的資料庫。

CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111';

CREATEDATABASE限制

Amazon Redshift 會針對資料庫強制執行以下限制:

  • 每個叢集最多 60 個使用者定義的資料庫。

  • 資料庫名稱最多 127 個位元組。

  • 資料庫名稱不能是保留字。

資料庫定序

定序是一組規則,用於SQL定義數據庫引擎如何比較和排序中的字符類型數據。不區分大小寫的定序是最常用的定序。Amazon Redshift 使用不區分大小寫的定序來協助從其他資料倉儲進行移轉。透過不區分大小寫定序的原生支援,Amazon Redshift 會繼續使用重要的調整或最佳化方法,例如分佈索引鍵、排序索引鍵或範圍限制掃描。

子COLLATE句會指定資料庫中所有資料行CHAR和VARCHAR資料行的預設定序。如果指定 CASE _,INSENSITIVE則全部CHAR或VARCHAR資料行會使用不區分大小寫的定序。如需有關定序的資訊,請參閱 定序序列

在不區分大小寫的資料欄中插入或擷取的資料將會保留其原始大小寫。但是所有基於比較的字串操作 (包括排序和分組) 也都不區分大小寫。類似於和規則運算式函數等LIKE述詞的模式比對作業也不區分大小寫。

下列SQL作業支援適用的定序語意:

  • 比較運算子:=、<>、<、<=、>、>=。

  • LIKE運營商

  • ORDERBY 子句

  • GROUPBY 子句

  • 使用字串比較的彙總函式,例如MINMAX和 LISTAGG

  • 視窗函數,例如 PARTITION BY 子句與 ORDER BY 子句

  • 標量函數最大()和最小(),STRPOS(),REGEXP_COUNT(),REGEXP_REPLACE(),REGEXP_INSTR(),REGEXP_SUBSTR()

  • 相異子句

  • UNION,INTERSECT以及 EXCEPT

  • 在 LIST

對於外部查詢 (包括 Amazon Redshift Spectrum 和 Aurora Postgre SQL 聯合查詢),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;

Connect 到剛剛使用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 的不區分大小寫排序。BobbobJohnjohn 的排序是不確定的,因為其在不區分大小寫的資料欄中是相等的。

SELECT * FROM T1 ORDER BY 1; col1 ------ bob Bob JOHN john Mary (5 rows)

同樣地,下面的例子顯示了 BY 子句不區分大小寫的GROUP順序。Bobbob 是同等的,屬於同一組。結果中會顯示哪一個是不確定的。

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和UNION的結果T2

CREATE TABLE T2 AS SELECT * FROM T1;
SELECT col1 FROM T1 UNION SELECT col1 FROM T2; col1 ------ john bob Mary (3 rows)