資料定義語言

使用 Cloud Spanner 的資料定義語言 (DDL) 執行以下作業:

  • 建立資料庫。
  • 建立、變更或捨棄資料庫中的資料表。
  • 新增、變更或捨棄資料表中的資料欄。
  • 建立或捨棄資料庫中的索引。

DDL 語法

statement:
    { create_database | create_table | create_index | alter_table | drop_table | drop_index }

create_database:
    CREATE DATABASE database_id

create_table:
    CREATE TABLE table_name (
    [column_def, ...] )
    primary_key [, cluster]

column_def:
    column_name {scalar_type | array_type} [NOT NULL] [options_def]

primary_key:
    PRIMARY KEY ( [key_part, ...] )

key_part:
    column_name [{ ASC | DESC }]

cluster:
    INTERLEAVE IN PARENT table_name [ ON DELETE { CASCADE | NO ACTION } ]

scalar_type:
    { BOOL | INT64 | FLOAT64 | STRING( length ) | BYTES( length ) | DATE | TIMESTAMP }

length:
    { int64_value | MAX }

array_type:
    ARRAY< scalar_type >

options_def:
  OPTIONS (allow_commit_timestamp = { true | null })

create_index:
    CREATE [UNIQUE] [NULL_FILTERED] INDEX index_name
    ON table_name ( key_part [, ...] ) [ storing_clause ] [ , interleave_clause ]

storing_clause:
    STORING ( column_name [, ...] )

interleave_clause:
    INTERLEAVE IN table_name

alter_table:
    ALTER TABLE table_name { table_alteration | table_column_alteration }

table_alteration:
{ ADD COLUMN column_def | DROP COLUMN column_name |
      SET ON DELETE { CASCADE | NO ACTION } }

table_column_alteration:
    ALTER COLUMN column_name { { scalar_type | array_type } [NOT NULL] | SET options_def }

drop_table:
    DROP TABLE table_name

drop_index:
    DROP INDEX index_name

int64_value:
    { decimal_value | hex_value }

decimal_value:
    [-]0—9+

hex_value:
    [-]0x{0—9|a—f|A—F}+

database_id:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

table_name, column_name, index_name:
    {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

標記法:

  • 方括號 "[ ]" 表示選擇性子句。
  • 括號 "( )" 表示文字括號。
  • 分隔號 "|" 表示邏輯上的「或」。
  • 大括號 "{ }" 用於括住一組選項。
  • 逗號後面加上刪節號表示前述項目可以在逗號分隔清單中重複。item [, ...] 表示一或多個項目,[item, ...] 則表示零或多個項目。
  • 逗號 "," 表示文字逗號。
  • 角括號 "<>" 表示文字角括號。
  • 連接號 "—" 表示符號兩側項目的值範圍。
  • 加號 "+" 表示前述項目可重複。

保留的關鍵字

有些字,像是類型名稱,會保留在 Cloud Spanner 的 DDL 中。若您需要使用保留的關鍵字做為結構定義中的 ID,請將其放置在倒引號 (`) 中。如需 Cloud Spanner 中完整的保留關鍵字清單,請參閱詞法結構和語法

例如:

CREATE TABLE MyTable (
  RowId INT64 NOT NULL,
  `Int64` INT64
) PRIMARY KEY (RowId)

DATABASE 陳述式

CREATE DATABASE

建立 Cloud Spanner 資料庫時,您必須提供 CREATE DATABASE 陳述式,定義資料庫的 ID:

CREATE DATABASE database_id

database_id:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

資料庫 ID:

  • 開頭必須為小寫字母。
  • 可以包含小寫字母、數字、底線和連字號,但不能包含大寫字母。
  • 結尾不得為底線或連字號。
  • 若是保留字或者包含連字號,請放置於倒引號 (`) 內。
  • 長度可以介於 2 到 30 個字元之間。
  • 建立後不得變更。

資料類型

純量

在 DDL 中使用純量類型的語法如下:

{ BOOL | INT64 | FLOAT64 | STRING( length ) | BYTES( length ) | DATE | TIMESTAMP }

length:
    { int64_value | MAX }

int64_value:
    { decimal_value | hex_value }

decimal_value:
    [-]0—9+

hex_value:
    [-]0x{0—9|a—f|A—F}+

int64_value

  • 可以落在 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 的範圍內。
  • 可以是 16 進位數字,前面加上「0x」(有區分大小寫)。

STRING

STRING 是變數長度 Unicode 字元字串。它的值必須是有效的 Unicode 字串。長度是必要的,代表欄位中可以儲存的 Unicode 字元數 (非位元組) 的最大值。

注意:

  • 寫入資料欄的作業會受到驗證,若新值不是有效的 Unicode 字串或超出指定長度,將會遭到拒絕。

  • length 可以是在 [1, 2621440] (2.5 MB) 範圍內的整數。

  • 針對長度無法預測或不需要限制的欄位,您可以將 length 直接設成 MAX 值 (相當於 2621440) 以進行驗證。

    只有儲存字串的實際長度才會影響到儲存成本;設為 MAX 不會使用額外的儲存空間容量。

  • Cloud Spanner 在伺服器接收 Unicode 字串時,Unicode 字串編碼必須是 UTF-8 格式。

  • 對照需透過 Unicode 字元數值進行 (技術上是透過編碼位置進行,會因為組合字元而有些許不同)。針對 ASCII 字串,這是傳統的排序順序。

  • 雖然您可以在建立資料表後縮減資料欄的長度,但若要這麼做,Cloud Spanner 就必須驗證現有資料符合長度限制。

BYTES

BYTES 是變數長度二進位字串。長度是必要的,代表欄位中可以儲存的最大位元組數。

注意:

  • 寫入資料欄的作業會受到驗證,若新值超出指定長度將會遭到拒絕。

  • length 可以是在 [1, 10485760] (10 MB) 範圍內的整數,或是直接設成 MAX, (相當於 10485760) 以進行驗證。

    只有實際儲存的位元組才會影響到儲存成本;設為 MAX 不會使用額外的儲存空間容量。

  • 雖然您可以在建立資料表後縮減資料欄的長度,但若要這麼做,Cloud Spanner 就必須驗證現有資料符合長度限制。

DATE

  • 不分時區的日期。
  • 範圍 [0001-01-01 至 9999-12-31] 是日期的合法區間。寫入日期欄的值若超出這個區間將會遭拒。
  • 如要瞭解詳情和標準格式,請參閱資料類型

TIMESTAMP

  • 精確度達奈秒的時間戳記。
  • 不分時區,橫跨 [0001-01-01 00:00:00 至 10000-01-01 00:00:00] 的範圍。
  • 如要瞭解詳情和標準格式,請參閱資料類型

陣列

在 DDL 中使用 ARRAY 類型的語法如下:

ARRAY< scalar_type >

Cloud Spanner 支援純量的陣列。陣列的主要目的是以最有效率的方式在空間中儲存值的集合。陣列不會提供個別元素的存取權;如要讀取或寫入單一元素,您必須讀取或寫入整個陣列。

若應用程式使用向量或重複欄位等資料結構,便可在 Cloud Spanner 陣列中輕易保有這些資料結構的狀態。

以下是 Singers 替代定義的範例,使用多個 ARRAY 類型的資料欄:

CREATE TABLE Singers (
  SingerId INT64,
  FeaturedSingerIds ARRAY<INT64>,
  SongNames ARRAY<STRING(MAX)>,
) PRIMARY KEY (SingerId) ...;

注意:

  • 不支援使用子類型 ARRAY 的陣列 (巢狀陣列)。
  • 純量值之類的陣列總計不能大於 10 MiB。
  • 陣列不得做為索引鍵資料欄使用。

TABLE 陳述式

CREATE TABLE

使用 CREATE TABLE 陳述式定義資料表。

CREATE TABLE table_name(
[column_def, ...] )
primary_key [, cluster]

column_def:
    column_name {scalar_type | array_type} [NOT NULL] [options_def]

primary_key:
    PRIMARY KEY ( [key_part, ...] )

key_part:
    column_name [{ ASC | DESC }]

cluster:
    INTERLEAVE IN PARENT table_name [ ON DELETE { CASCADE | NO ACTION } ]

table_name and column_name:
    {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

options_def:
  OPTIONS (allow_commit_timestamp = { true | null })

注意:

  • 在主鍵資料欄名稱新增 DESC 註解,會將資料的實體配置從預設的遞增排序變更為遞減排序。

  • INTERLEAVE IN PARENT 定義子項到父項的資料表關係,導致父項和子項資料列產生實體交錯。父項主鍵資料欄的名稱和類型位置,必須符合任一子項主鍵資料欄的前置字串。若對應的父項資料列不存在,新增資料列到子項資料表便會失敗。父項資料列可能已經存在於資料庫中,或者在稍早新增資料列到子項資料表的相同交易中新增。

  • 當變異嘗試刪除父項資料列時,選用的 ON DELETE 子句會定義 ChildTable 中資料列的行為。支援的選項如下:

    • CASCADE:已刪除子項資料列。
    • NO ACTION:未刪除子項資料列。若刪除父項會留下子項資料列,而違反父項和子項的參考完整性,寫入便會失敗。

    您可以省略 ON DELETE 子句,在該情況下預設使用 ON DELETE NO ACTION

  • NOT NULL 註解使得插入新資料列的所有變異都需要某個資料欄。您不得在現有資料表中新增 NOT NULL 資料欄 (然而有一個解決方法是您新增一個可以為空值的資料欄,透過寫入所有資料列填滿該欄,然後在該欄上以 NOT NULL 註解更新結構定義)。

  • 資料表與資料欄名稱:

    • 長度可以介於 1 到 128 個字元之間。
    • 開頭必須為大寫或小寫字母。
    • 可包含大寫和小寫字母、數字及底線,但不包含連字號。
    • 區分大小寫。例如,您不得在相同的資料庫中建立命名為 mytableMyTable 的資料表,也不得在相同資料表中建立名為 mycolumnMyColumn 的資料欄。
  • allow_commit_timestamp 選項允許插入和更新作業,要求 Cloud Spanner 將交易的修訂時間戳記寫入資料欄。詳情請參閱修訂時間戳記

ALTER TABLE

使用 ALTER TABLE 陳述式變更資料表定義。

ALTER TABLE table_name { table_alteration | table_column_alteration }

table_alteration:
{ ADD COLUMN column_def | DROP COLUMN column_name |
      SET ON DELETE { CASCADE | NO ACTION } }

table_column_alteration:
  ALTER COLUMN column_name { { scalar_type | array_type } [NOT NULL] | SET options_def }

options_def:
  OPTIONS (allow_commit_timestamp = { true | null })

(allow_commit_timestamp=true) 選項允許插入和更新作業,要求 Cloud Spanner 將交易的修訂時間戳記寫入資料欄。詳情請參閱修訂時間戳記

DROP TABLE

使用 DROP TABLE 陳述式捨棄資料表。DROP TABLE 作業無法復原。

DROP TABLE table_name

INDEX 陳述式

CREATE INDEX

使用 CREATE INDEX 陳述式定義次要索引

語法

CREATE [UNIQUE] [NULL_FILTERED] INDEX index_name
ON table_name ( key_part [, ...] ) [ storing_clause ] [ , interleave_clause ]

storing_clause:
    STORING ( column_name [, ...] )

interleave_clause:
    INTERLEAVE IN table_name

index_name:
    {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

注意:

  • UNIQUE 表示此次要索引會在被索引的資料上強制執行 UNIQUE 限制。如果交易可能導致索引鍵重複,UNIQUE 限制會讓交易遭到拒絕。詳情請參閱唯一索引

  • NULL_FILTERED 表示此次要索引不會索引 NULL 值。詳情請參閱 NULL 索引

  • INTERLEAVE IN 定義了索引要交錯的資料表。若 T 是索引要交錯的資料表,則:

    • T 必須是被索引資料表的父項,而且
    • T 的主鍵必須是該索引的索引鍵前置字串。

    建立交錯索引的時機為何?若您要用於索引作業的索引鍵與資料表的索引鍵吻合,即可在資料表中交錯索引,前提是資料表中的資料列與對應的索引資料列具備在地運算關係。

    例如,若您希望針對 Singers 的特定資料列,建立 Songs 所有資料列的索引,您的索引鍵應包含 SingerIdSongName。若您經常在從索引擷取歌手的歌曲時擷取歌手的相關資訊,也很適合將索引交錯於 Singers 之中。建立次要索引中的 SongsBySingerSongName 定義便是建立這種交錯索引的範例。

    與交錯資料表相同,交錯索引內的項目會儲存在父項資料表對應的資料列中。詳情請參閱資料庫分割

  • DESC 定義對應索引欄的遞減掃描順序。當使用標示為 DESC 的索引欄掃描資料表時,掃描的資料列會根據此索引欄,以遞減的順序顯示。若您未指定排序順序,預設為遞增 (ASC)。

  • STORING 提供從資料表複製資料到該資料表一或多個次要索引的機制。這個機制需要額外的儲存空間成本,但可以減少使用次要索引查詢資料時讀取延遲的情形,因為這個機制不需要在索引中找到想要的項目之後,再從主資料表擷取資料。請參閱 STORING 子句範例。

  • 索引名稱:

    • 長度可以介於 1 到 128 個字元之間。
    • 開頭必須為大寫或小寫字母。
    • 可包含大寫和小寫字母、數字及底線,但不包含連字號。
    • 區分大小寫。例如,您不可在相同的資料庫中建立名為 myindexMyIndex 的索引。

DROP INDEX

使用 DROP INDEX 陳述式捨棄次要索引。

DROP INDEX index_name
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Spanner 說明文件