CREATE DATABASE - Amazon Redshift

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

CREATE DATABASE

建立新的資料庫。

若要建立資料庫,您必須是超級使用者或具有 CREATEDB 權限。

您無法在交易區塊 (BEGIN ... END) 中執行 CREATE DATABASE。如需交易的相關資訊,請參閱 可序列化隔離

語法

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 } [ IAM_ROLE default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ] ]

參數

database_name

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

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 的資料欄,其中包含 01 值。每個使用者的 UPDATE 陳述式都不會與其他使用者重疊。但是,01 值會交換。他們執行的 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 NO DATA CATALOG SCHEMA | DATA CATALOG SCHEMA '<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 操作的許可。若要深入了解如何在使用資料庫建立資料庫時使用 IAM_ROLE,請參閱以 AWS Glue Data Catalog 取用者身分使用 Lake 格式化管理的資料庫。

以下顯示單一 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 帳戶內的資料庫建立資料庫時,請指定「命名空間」選項。ACCOUNT 是選用選項。當您使用 CREATE DATABASE 從跨 AWS 帳戶的資料庫建立資料庫時,請指定來自生產者的帳戶和命名空間。

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

建立資料庫 AWS Glue Data Catalog

若要使用資料庫 ARN 建立 AWS Glue 資料庫,請在「建立資料庫」指令中指定 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;

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

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

同樣地,下面範例顯示使用 GROUP BY 子句的不區分大小寫排序。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 子句查詢

下列範例顯示資料表 T1T2 UNION 的結果。

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