CREATE TABLE [使用中]

適用於:已勾選為是 Databricks SQL 已勾選為是 Databricks Runtime

定義受管理 、臨時或外部資料表,對於非暫存資料表,則可選擇使用資料來源。

此指令會 CREATE TEMP TABLE 建立一個會話本地的暫存資料表,在會話中暫時保留資料。 資料表名稱必須不加限定(不得使用結構或目錄前綴)。 臨時資料表不存在於目前的結構或目錄中,只能在建立它們的會話中存取。 Databricks 會在會話結束時自動丟棄暫存資料表。

Important

當你設定帶有密碼或令牌的表格選項時,為了保護它們安全,請用函式提供 secret 該值,而不是直接在子句中 OPTIONS 輸入字面值。 這讓你可以參考 Databricks 秘密服務 中儲存的秘密,而不是在語句中包含憑證值。 請參考 範例。

語法

{ { [CREATE OR] REPLACE { TEMP | TEMPORARY } TABLE | CREATE [EXTERNAL] TABLE [ IF NOT EXISTS ] | CREATE { TEMP | TEMPORARY } TABLE}
  table_name
  [ table_specification ]
  [ USING data_source ]
  [ table_clauses ]
  [ AS query ] }

table_specification
  ( { column_identifier column_type [ column_properties ] } [, ...]
    [ , table_constraint ] [...] )

column_properties
  { NOT NULL |
    COLLATE collation_name |
    GENERATED ALWAYS AS ( expr ) |
    GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start | INCREMENT BY step ] [ ...] ) ] |
    DEFAULT default_expression |
    COMMENT column_comment |
    column_constraint |
    MASK clause } [ ... ]

table_clauses
  { OPTIONS clause |
    PARTITIONED BY clause |
    CLUSTER BY clause |
    clustered_by_clause |
    LOCATION path [ WITH ( CREDENTIAL credential_name ) ] |
    COMMENT table_comment |
    TBLPROPERTIES clause |
    DEFAULT COLLATION default_collation_name |
    WITH { ROW FILTER clause } } [...]

clustered_by_clause
  { CLUSTERED BY ( cluster_column [, ...] )
    [ SORTED BY ( { sort_column [ ASC | DESC ] } [, ...] ) ]
    INTO num_buckets BUCKETS }

在 Databricks Runtime 16.1 中,START WITH 必須在 INCREMENT BY之前。

參數

  • 取代

    如果指定,則會取代數據表及其內容,如果已經存在的話。 只有 Delta 和 Apache Iceberg 數據表才支援這個子句。

    REPLACE 保留 表格歷程記錄 和授與的權限、列過濾器和欄遮罩。

    注意

    Azure Databricks強烈建議使用 REPLACE,而不是丟棄並重新建立表格。

  • 外部

    如果指定,會建立 外部數據表。 建立外部數據表時,您也必須提供 LOCATION 子句。 卸除外部數據表時,將不會卸除位於 LOCATION 的檔案。

  • 暫存或暫時的

    適用於:勾選標記為是 Databricks SQL 勾選標記為是 Databricks 執行環境 18.1 及以上版本

    若指定,則會建立或替換暫存資料表。 建立或替換暫存資料表時,不要在子 USING 句或子 LOCATION 句中指定資料來源。 以下條款不支援: PARTITIONED BY、 CLUSTER BY及列級過濾器。 以下欄位屬性不支援: GENERATED 欄位遮罩。

    對於 REPLACE 指令,如果 TEMPORARY 關鍵字未指定,該指令只會替換一個永久資料表。 如果存在相同未限定名稱的暫存資料表,會產生錯誤 TEMP_TABLE_REPLACE_PERMANENT_NAME_CONFLICT 。

  • 如果不存在

    如果指定且具有相同名稱的數據表已經存在,則會忽略 語句。

    IF NOT EXISTS 無法與 REPLACE 共存,這表示不允許 CREATE OR REPLACE TABLE IF NOT EXISTS。

  • table_name

    要建立之數據表的名稱。 名稱不得包含 時態規格或選項規格。 若名稱未被限定,資料表會在目前的架構中建立。

    中建立的資料表只能包含字母數字 ASCII 字元和底線(INVALID_SCHEMA_OR_RELATION_NAME)。

    Iceberg 數據表必須在 Unity 目錄中建立。 在hive_metastore中不支援建立 Iceberg 表格。

建立暫存資料表時,請使用不限定的名稱(不使用目錄或結構)。 若暫存資料表或檢視與永久物件名稱相同,未限定名稱指的是該暫存物件。 透過包含目錄或結構的限定名稱存取永久物件。 詳情請參閱 表格及查看決議 。

  • 表格規格

    這個選擇性子句會定義數據行清單、其類型、屬性、描述和數據行條件約束。

    如果您未定義資料表架構的欄位,則必須指定 AS query 或 LOCATION。

    • column_identifier

      欄位的唯一名稱。

      沒有資料列對應屬性之 Delta 資料表的資料列識別碼 ('delta.columnMapping.mode' = 'name') 不得包含空白或下列字元: , ; { } ( ) \n \t = 。

      表格的 AVRO 欄位識別符號必須以底線(_)或 Unicode 字母(包括非 ASCII 字母)開頭,接著是 Unicode 字母、數字和底線的組合。

      數據表的數據 ICEBERG 行標識碼必須是唯一、不區分大小寫,並遵循標準 SQL 標識符規則。 避免使用空格或特殊字元,因為所有查詢引擎都可能不支持這些字元。

    • 欄位類型

      指定數據行的數據類型。 並非所有 Azure Databricks 支援的 資料型別都被所有資料來源支援。

    • 非空

      如果指定,則數據行不接受 NULL 值。 只有 Delta 和 Iceberg 數據表才支援這個子句。

    • 定序 collation_name

      適用於:已核取為是 Databricks SQL 已核取為是 Databricks Runtime 16.1 和更新版本

      針對 STRINGcolumn_type 可選擇性地指定排序規則,以在此欄位上套用比較和排序操作。 預設排序規則是資料表 default_collation_name。

    • 產生的 ALWAYS AS ( expr )

      當您指定這個子句時,這個欄位的值取決於指定的 expr。

      資料表的 DEFAULT COLLATION 必須 UTF8_BINARY。

      expr 可能包含常值、數據表中的數據行標識符,以及決定性的內建 SQL 函式或運算符,但除外:

      也 expr 不得包含任何 子查詢。

    • GENERATED { ALWAYS |依預設 } AS IDENTITY [ [ [ START WITH start ] [ INCREMENT BY step ] ]

      適用於:勾選標記為是 Databricks SQL 勾選標記為是 Databricks Runtime 10.4 LTS 和更新版本

      定義識別欄位。 當您寫入數據表,且未提供識別欄位的值時,它將自動指派一個唯一且統計上遞增(若 step 為負數,則遞減)的數值。 只有 Delta 數據表才支援這個子句。 這個子句只能用於具有 BIGINT 資料類型的數據行。

      自動指派的值會從 start 開始,並以 step遞增。 指派的值是唯一的,但不保證是連續的。 這兩個參數都是選擇性的,預設值為1。 step 不可以是 0。

      如果自動指派的值超出識別數據行類型的範圍,查詢將會失敗。

      使用 ALWAYS 時,您無法提供自己的識別數據行值。

      不支援下列作業:

      • PARTITIONED BY 識別欄位
      • UPDATE 識別欄位

      注意

      宣告資料表中的識別欄將停用並行交易。 只有在不需要同時寫入目標數據表的情況下,才使用識別數據行。

    • DEFAULT 預設表達式

      適用於:打勾標示為是 Databricks SQL 打勾標示為是 Databricks Runtime 11.3 LTS 和更新版本

      當數據行未指定時,定義 DEFAULT 值以用於 INSERT、UPDATE和 MERGE ... INSERT 上的數據行。

      如果未指定預設值,DEFAULT NULL 會套用於可為 Null 的欄。

      default_expression 可能由常值和內建 SQL 函式或運算子組成,但下列函式除外:

      也 default_expression 不得包含任何 子查詢。

      DEFAULT 支援 CSV、JSON、PARQUET 和 ORC 來源。

    • 批注column_comment

      描述列的字符串文本。

    • column_constraint

      將主鍵或外鍵約束加入數據表中的欄位。

      hive_metastore 目錄中的數據表不支持條件約束。

      若要將檢查條件約束新增至資料表,請使用 ALTER TABLE。

    • MASK 子句

      適用於:選取標記為是 Databricks SQL 選取標記為是 Databricks Runtime 12.2 LTS 及以上版本 選取標記僅限於 Unity Catalog

      新增數據行遮罩函式來匿名敏感數據。 該列的所有後續查詢都會接收將該函式應用於該列所得到的結果,取代該列的原始值。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要修改值。

      如果您要取代表格,且新表格包含與原始資料表相同的資料行名稱,則會保留任何現有的資料行遮罩,即使未明確重新定義它們也一樣。 這可防止意外遺失資料存取原則。

    • 資料表限制

      將參考主鍵或參考外鍵條件約束加入至數據表。

      hive_metastore 目錄中的數據表不支援索引鍵約束。

      若要將檢查條件約束新增至資料表,請使用 ALTER TABLE。

  • 使用「data_source」

    data_source 可以是檔格式或同盟 JDBC 數據源。

    檔案格式必須是下列其中一項:

    • AVRO
    • BINARYFILE
    • CSV
    • DELTA
    • ICEBERG
    • JSON
    • ORC
    • PARQUET
    • TEXT

    對於除 DELTA 或 ICEBERG之外的任何檔案格式,若未指定 或 LOCATIONAS query,該資料表將建立為無資料的受管理資料表。

    支援下列聯邦 JDBC 來源:

    • POSTGRESQL
    • SQLSERVER
    • MYSQL
    • BIGQUERY
    • NETSUITE
    • ORACLE
    • REDSHIFT
    • SNOWFLAKE
    • SQLDW
    • SYNAPSE
    • SALESFORCE
    • SALESFORCE_DATA_CLOUD
    • TERADATA
    • WORKDAY_RAAS
    • MONGODB

    指定同盟 JDBC 來源時,您也必須使用必要的連接資訊來指定 OPTIONS 子句。 如需查詢同盟數據源的詳細資訊,請參閱 使用 JDBC 查詢資料庫 。

    Databricks Runtime 支援下列用於數據表的其他檔案格式:

    • JDBC
    • LIBSVM
    • org.apache.spark.sql.sources.DataSourceRegister 的自訂實作的完整類別名稱。

    若省略 USING,則預設值為 DELTA。

    此 USING 條款不支援臨時資料表。

    以下內容適用於: Databricks Runtime

    Databricks Runtime 支援使用 HIVE 建立 Hive SerDe 資料表。 您可以使用 file_format 子句來指定 Hive 特定的 row_format 和 OPTIONS,這是一種不區分大小寫的字串映射。 option_keys 為:

    • FILEFORMAT
    • INPUTFORMAT
    • OUTPUTFORMAT
    • SERDE
    • FIELDDELIM
    • ESCAPEDELIM
    • MAPKEYDELIM
    • LINEDELIM
  • 表格條款

    選擇性地指定新資料表的位置、資料分割、叢集、選項、批注和使用者定義屬性。 每個次子句只能指定一次。

    • 按...分區

      選擇性子句,可依部分欄位分割數據表。

      此 PARTITIONED BY 條款不支援臨時資料表。

      注意

      對於管理的 Iceberg 表格,Azure Databricks 不支援 PARTITIONED BY。 請改用液體叢集 (CLUSTER BY) 來優化數據配置。 對於 Delta 資料表,如果你省略了資料表定義,Azure Databricks 會將分割欄位放在表格末尾,即使你在欄位規範中早先列出。

    • CLUSTER BY

      適用於:已核可 Databricks SQL 已核可 Databricks Runtime 13.3 和以上版本

      使用選用的子句將 Delta 或 Iceberg 數據表依行的子集進行叢集。 請參閱 針對數據表使用液體叢集。 若要叢集其他資料表,請使用 clustered_by_clause。

      對於 Iceberg 資料表,當您使用 CLUSTER BY時,您必須明確停用刪除向量和數據列標識碼。

      搭配使用 CLUSTER BY AUTO自動液體叢集,Databricks 會智慧地選擇叢集索引鍵,以優化查詢效能。

      您無法將液體群集與 PARTITIONED BY結合。

    • 群集依據子句

      選擇性地使用列子集將數據表或每個分割區叢集到固定數目的哈希桶中。

      Delta 或 Iceberg 數據表不支持這個子句。 請改用 CLUSTER BY。

      • 按叢集排序

        指定用來叢集每個資料分區的欄位集,若未指定資料分區,則對整個資料表進行叢集。

        • cluster_column

          參考數據表中 column_identifier 的標識碼。 如果您指定多個欄位,則不得有重複項目。 由於叢集在分割層級上運作,因此您不得將分割區數據行命名為叢集數據行。

          此 CLUSTERED BY 條款不支援臨時資料表。

      • 排序依據

        可選擇性地維持分桶中資料列的排序順序。

        • sort_column

          排序桶依據的欄位。 此欄位不得為分割欄位。 排序欄必須是唯一的。

        • ASC 或 DESC

          選擇性地指定 sort_column 是以遞增 (ASC) 或遞減 (DESC) 順序排序。 預設值為 ASC。

      • 進入num_buckets桶

        INTEGER 常值,指定將每個資料分割(或在未指定資料分割時,為整個數據表)分成多少個桶。

    • LOCATION path [ WITH ( CREDENTIAL credential_name ) ]

      儲存表格資料的目錄的選擇性路徑,此路徑可能在分散式儲存上。 path 必須是字串常值。 如果你指定沒有位置,該表格會被視為 managed table,Azure Databricks會建立一個預設的表格位置。

      指定位置會使資料表成為 外部資料表。

      對於不在hive_metastore目錄中的資料表path,除非指定有效的儲存憑證,否則資料表必須受到外部位置的保護。

      您無法在與 Managed 資料表位置重疊的位置中建立外部資料表。

      對於 Delta 數據表,如果數據已存在於該路徑,數據表就會從 LOCATION 繼承其組態。 因此,任何指定的 TBLPROPERTIES、 table_specification或 PARTITIONED BY 子句必須完全符合 Delta 位置的現有數據。

      Iceberg 數據表不支援 LOCATION 子句。 當您建立外部目錄時,會自動註冊外部 Iceberg 數據表,而且您必須建立 Managed Iceberg 數據表,而不需指定位置。

      此 LOCATION 條款不支援臨時資料表。

    • 選項

      設定或重設一或多個使用者定義的數據表選項。

    • 註解 table_comment

      用於描述表的字串字面值。

    • TBLPROPERTIES

      選擇性地設定一個或多個使用者定義的屬性。

    • 預設排序 default_collation_name

      適用於:已勾選 是 Databricks SQL 已勾選 是 Databricks Runtime 16.3 以上版本

      定義要用於下列項目的默認排序規則:

      • STRING 資料表的列和欄位
      • DEFAULT 表示式
      • CREATE TABLE AS query 主體

      CHECK 條件約束和生成欄位運算式需要預設的排序規則 UTF8_BINARY。

      如果未指定,預設排序規則會從創建表格的架構中派生。

    • WITH ROW FILTER 子句

      適用於:選取標記為是 Databricks SQL 選取標記為是 Databricks Runtime 12.2 LTS 及以上版本 選取標記僅限於 Unity Catalog

      將數據列篩選函式加入至數據表。 從該數據表進行的所有後續查詢將會獲取函式評估為布爾值為真的行的子集。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要篩選特定數據列。

      如果您要取代資料表,則會保留任何現有的資料列篩選器,即使它們未明確重新定義也一樣。 這可防止意外遺失資料存取原則。

      此 ROW FILTER 條款不支援臨時資料表。

  • AS 查詢

    這個選擇性子句會使用 來自 query的數據填入數據表。 當您指定 query 時,不得同時指定 table_specification。 數據表架構衍生自查詢。

    請注意,Azure Databricks 會用輸入查詢的資料覆蓋底層資料來源,以確保建立的資料表與輸入查詢資料完全相同。

範例

-- Creates a Delta table
> CREATE TABLE student (id INT, name STRING, age INT);

-- Creates a managed Iceberg table
> CREATE TABLE edu.enrollment.student (id INT, name STRING, age INT) USING ICEBERG;

-- Use data from another table
> CREATE TABLE student_copy AS SELECT * FROM student;

-- Creates a CSV table from an external directory
> CREATE TABLE student USING CSV LOCATION '/path/to/csv_files';

-- Specify table comment and properties
> CREATE TABLE student (id INT, name STRING, age INT)
    COMMENT 'this is a comment'
    TBLPROPERTIES ('foo'='bar');

-- Specify table comment and properties with different clauses order
> CREATE TABLE student (id INT, name STRING, age INT)
    TBLPROPERTIES ('foo'='bar')
    COMMENT 'this is a comment';

-- Create partitioned table
> CREATE TABLE student (id INT, name STRING, age INT)
    PARTITIONED BY (age);

-- Create a table with a generated column
> CREATE TABLE rectangles(a INT, b INT,
                          area INT GENERATED ALWAYS AS (a * b));

-- Create a table with a string column with a case-insensitive collation.
> CREATE TABLE names(name STRING COLLATE UNICODE_CI);

-- Create a table with a default collation and override for a specific column.
> CREATE TABLE names(name STRING, first_name STRING, id STRING COLLATE UTF8_BINARY) DEFAULT COLLATION UNICODE_CI;

-- Create an external table connected to Oracle.
-- Provide the user and password using the secret function rather than
-- entering them directly.
> CREATE TABLE IF NOT EXISTS ora_tab
  USING ORACLE
  OPTIONS (
    url '<jdbc-url>',
    dbtable '<table-name>',
    user secret('secrets.r.us', 'oracleUser'),
    password secret('secrets.r.us', 'oraclePassword')
);

> SELECT * FROM ora_tab;

-- Create a temporary table, insert values in it, and display its contents.
> CREATE TEMP TABLE temp_1 (a INT);
> INSERT INTO temp_1 VALUES (1);
> SELECT * FROM temp_1;
  a
  ----
  1

> CREATE OR REPLACE TEMP TABLE temp_1 (a VARCHAR(100));
> DESCRIBE TABLE temp_1;
colName     dataType
-------     --------
      a   varchar(100)