ALTER TABLE (Databricks SQL)

改變數據表的架構或屬性。

如需 Delta Lake 中的類型變更或重新命名資料行,請參閱 重寫資料

若要變更資料表上的批註,請使用 COMMENT ON

如果快取資料表,命令會清除資料表的快取資料,以及參考資料表的所有相依專案。 下次存取資料表或相依專案時,快取將會延遲填滿。

所需的權限

如果您使用 Unity 目錄,您必須具有 MODIFY 下列許可權:

  • ALTER COLUMN
  • ADD COLUMN
  • DROP COLUMN
  • SET TBLPROPERTIES
  • UNSET TBLPROPERTIES

所有其他作業都需要資料表的擁有權。

語法

ALTER TABLE table_name
   { RENAME TO clause |
     ADD COLUMN clause |
     ALTER COLUMN clause |
     DROP COLUMN clause |
     RENAME COLUMN clause |
     ADD CONSTRAINT clause |
     DROP CONSTRAINT clause |
     ADD PARTITION clause |
     DROP PARTITION clause |
     RENAME PARTITION clause |
     RECOVER PARTITIONS clause |
     SET TBLPROPERTIES clause |
     UNSET TBLPROPERTIES clause |
     SET LOCATION clause |
     SET OWNER TO clause }

參數

  • table_name

    識別要改變的資料表。 名稱不得包含 時態規格

  • 重新命名為 to_table_name

    重新命名相同架構內的資料表。

  • ADD COLUMN

    資料來源不支援 JDBC 這個子句。

    將一或多個資料行加入資料表,或欄位新增至 Delta Lake 資料表中的現有資料行。

    { ADD [COLUMN | COLUMNS ]
      ( { { column_identifier | field_name } data_type
          [DEFAULT clause] [COMMENT comment] [FIRST | AFTER identifier]
          } [, ...] ) }
    
    • column_identifier

      要加入之資料行的名稱。 名稱在資料表中必須是唯一的。

      除非 FIRST 指定 或 AFTER name ,否則會在結尾附加資料行或欄位。

    • field_name

      要加入至現有資料行之欄位的完整名稱。 巢狀欄位路徑的所有元件都必須存在,而且功能變數名稱本身必須是唯一的。

    • DEFAULT default_expression

      需要:SQL 倉儲 2022.35 版或更高版本。 此版本可在預覽通道中使用。

      DEFAULT定義未指定資料行時所使用 INSERTMERGE ... INSERT 資料行的值。

      如果未指定預設值, DEFAULT NULL 則會隱含可為 Null 的資料行。

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

      default_expression 不得包含任何 子查詢

      DEFAULT 支援 CSVJSONPARQUETORC 來源。

    • data_type

      指定資料行或欄位的資料類型。 並非所有資料來源都支援 Azure Databricks 支援的所有 資料類型

    • 批註批註

      描述加入之資料行或欄位的選擇性 STRING 常值。

    • FIRST

      如果指定資料行將會新增為數據表的第一個資料行,或欄位會新增為包含結構中的 第一個欄位。

    • AFTER 識別碼

      如果指定了資料行或欄位,則會緊接在欄位或資料行 identifier 之後加入 。

  • ALTER COLUMN

    變更屬性或資料行的位置。

    { { ALTER | CHANGE } [COLUMN] { column_identifier | field_name }
      { COMMENT comment |
        { FIRST | AFTER column_identifier } |
        { SET | DROP } NOT NULL |
        SET DEFAULT clause |
        DROP DEFAULT |
        SYNC IDENTITY } }
    
    • column_identifier

      要改變的資料行名稱。

    • field_name

      要改變之欄位的完整名稱。 巢狀欄位路徑的所有元件都必須存在。

    • 批註批註

      變更資料行的描述 column_namecomment 必須是 STRING 常值。

    • FIRSTAFTER 識別碼

      將資料行從其目前位置移至前方 () FIRST 或立即 AFTERidentifier 只有在 是 Delta 資料表時 table_name ,才支援這個子句。

    • SET NOT NullDROP NOT Null

      變更有效資料行值的定義域,以排除 Null SET NOT NULL ,或包含 Null DROP NOT NULL 。 只有 Delta Lake 資料表才支援此選項。 Delta Lake 可確保條件約束對所有現有和新資料都有效。

    • 同步身分識別

      同步處理識別資料行的中繼資料與實際資料。 當您將自己的值寫入識別資料行時,它可能不符合中繼資料。 此選項會評估狀態,並更新中繼資料,以與實際資料一致。 在此命令之後,下一個自動指派的識別值會從 start + (n + 1) * step 開始,其中 n 是符合正步驟 (的最小值 start + n * step >= max()) 。

      只有 Delta Lake 資料表上的識別資料行才支援此選項。

    • DROP DEFAULT

      需要:SQL 倉儲 2022.35 版或更高版本。 此版本可在預覽通道中使用。

      從資料行中移除預設運算式。 對於可為 Null 的資料行,這相當於 SET DEFAULT NULL 。 針對使用 定義 NOT NULL 的資料行,您需要在每個未來的 INSERT 作業上提供值

  • DEFAULT default_expression

    需要:SQL 倉儲 2022.35 版或更高版本。 此版本可在預覽通道中使用。

    DEFAULT定義未指定資料行時所使用 INSERTMERGE ... INSERT 資料行的值。

    如果未針對可為 Null 的資料行隱 DEFAULT NULL 含任何預設值,則為 。

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

    default_expression 不得包含 子查詢

    DEFAULT 支援 CSVJSONORCDELTA 來源。

    當您定義新加入資料行的預設值時,預設值會套用至所有預先存在的資料列。 如果預設值包含非決定性函式,例如 randcurrent_timestamp 值會在執行 時 ALTER TABLE 計算一次,並套用為預先存在的資料列常數。 針對新插入的資料列,預設運算式會針對每個資料列執行一次。

    當您使用 ALTER COLUMN 現有的資料列設定預設值時,不會受到該變更的影響。

  • data_type

    指定資料行或欄位的資料類型。 並非所有資料來源都支援 Azure Databricks 支援的所有 資料類型

  • DROP COLUMN

    重要事項

    這項功能處於公開預覽狀態

    卸載 Delta Lake 資料表中的一或多個資料行或欄位。

    當您卸載資料行或欄位時,必須卸載相依檢查條件約束和產生的資料行。

    如需需求,請參閱 Azure Databricks 上的資料行對應

    DROP [COLUMN | COLUMNS] [ IF EXISTS ] ( { {column_identifier | field_name} [, ...] )
    
    • IF EXISTS

      當您指定 IF EXISTS 時,Azure Databricks 會忽略嘗試卸載不存在的資料行。 否則,卸載不存在的資料行將會導致錯誤。

    • column_identifier

      現有資料行的名稱。

    • field_name

      現有欄位的完整名稱。

  • 重新命名資料行

    重要事項

    這項功能處於公開預覽狀態

    重新命名 Delta Lake 資料表中的資料行或欄位。

    當您重新命名資料行或欄位時,也需要變更相依檢查條件約束和產生的資料行。 將會卸載任何使用 資料行的主鍵和外鍵。 如果是外鍵,您必須擁有定義外鍵的資料表。

    如需需求,請參閱 Azure Databricks 上的資料行對應

    RENAME COLUMN { column_identifier TO to_column_identifier|
                    field_name TO to_field_identifier }
    
  • ADD CONSTRAINT

    將檢查條件約束、參考外鍵條件約束或參考主鍵條件約束加入資料表。

    目錄中的資料表 hive_metastore 不支援外鍵和主鍵。

  • DROP CONSTRAINT

    從資料表卸載主鍵、外鍵或檢查條件約束。

  • ADD PARTITION

    如果指定會將一或多個分割區加入資料表中。 Delta Lake 資料表不支援新增資料分割。

    ADD [IF NOT EXISTS] { PARTITION clause [ LOCATION path ] } [...]
    
    • 如果不存在

      選擇性子句,指示 Azure Databricks 在分割區已經存在時忽略 語句。

    • PARTITION 子句

      要加入的資料分割。 資料分割索引鍵必須符合資料表的資料分割,並與值相關聯。 如果分割區已經存在,除非已指定,否則 IF NOT EXISTS 會引發錯誤。

    • LOCATION 路徑

      path 必須是 STRING 常值,代表指向資料分割的選擇性位置。

      如果未指定位置,則位置會衍生自資料表的位置和資料分割索引鍵。

      如果有檔案存在於填入資料分割的位置,則必須與 data_source 資料表及其選項相容。

  • DROP PARTITION

    如果指定這個子句會從資料表卸載一或多個資料分割,可以選擇性地刪除分割區位置上的任何檔案。

    Delta Lake 資料表不支援卸載資料分割。

    DROP [ IF EXISTS ] PARTITION clause [, ...] [PURGE]
    
    • IF EXISTS

      當您指定 IF EXISTS Azure Databricks 時,將會忽略嘗試卸載不存在的資料分割。 否則,非現有的分割區將會導致錯誤。

    • PARTITION 子句

      指定要卸載的資料分割。 如果分割區只有部分識別,則會卸載分割區的配量。

    • 清除

      如果設定,即使目錄已設定資料,資料表目錄也必須略過 [垃圾桶] 資料夾來移除資料分割資料。 此選項僅適用于 Managed 資料表。 只有在:

      檔案系統支援垃圾桶資料夾。 目錄已設定為將卸載的資料分割移至垃圾桶資料夾。 AWS S3 中沒有垃圾桶資料夾,因此它無效。

      卸載分割區之後,不需要手動刪除檔案。

  • 重新命名資料分割

    取代資料分割的索引鍵。

    Delta Lake 資料表不支援重新命名資料分割。

    from_partition_clause RENAME TO to_partition_clause
    
  • 復原資料分割

    這個子句不適用於 Delta Lake 資料表。

    指示 Azure Databricks 掃描資料表的位置,並將任何檔案新增至直接新增至檔案系統的資料表。

  • SET TBLPROPERTIES

    設定或重設一或多個使用者定義的屬性。

  • UNSET TBLPROPERTIES

    移除一或多個使用者定義的屬性。

  • SET LOCATION

    移動資料分割或資料表的位置。

    Delta Lake 不支援移動 Delta Lake 資料表的個別分割區。

    [ PARTITION clause ] SET LOCATION path
    
    • PARTITION 子句

      選擇性地識別要變更位置的分割區。 如果您省略命名資料分割 Azure Databricks,則會移動資料表的位置。

    • LOCATION 路徑

      path 必須是 STRING 常值。 指定分割區或資料表的新位置。

      原始位置中的檔案 將不會 移至新位置。

  • [ SET ]擁有者至 主體

    將資料表的擁有權轉移至 principal

    SET 允許作為選擇性關鍵字。 需要:SQL 倉儲 2022.35 版或更高版本。 此版本可在預覽通道中使用。

例子

如需 Delta Lake 新增和改變數據行範例,請參閱

-- RENAME table
> DESCRIBE student;
                col_name data_type comment
 ----------------------- --------- -------
                    name    string    NULL
                  rollno       int    NULL
                     age       int    NULL
 # Partition Information
              # col_name data_type comment
                     age       int    NULL

> ALTER TABLE Student RENAME TO StudentInfo;

-- After Renaming the table
> DESCRIBE StudentInfo;
                col_name data_type comment
 ----------------------- --------- -------
                    name    string    NULL
                  rollno       int    NULL
                     age       int    NULL
 # Partition Information
              # col_name data_type comment
                     age       int    NULL

-- RENAME partition
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=10
    age=11
    age=12

> ALTER TABLE default.StudentInfo PARTITION (age='10') RENAME TO PARTITION (age='15');

-- After renaming Partition
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15

-- Add new columns to a table
> DESCRIBE StudentInfo;
                col_name data_type comment
 ----------------------- --------- -------
                    name    string    NULL
                  rollno       int    NULL
                     age       int    NULL
 # Partition Information
              # col_name data_type comment
                     age       int    NULL

> ALTER TABLE StudentInfo ADD columns (LastName string, DOB timestamp);

-- After Adding New columns to the table
> DESCRIBE StudentInfo;
                col_name data_type comment
 ----------------------- --------- -------
                    name    string    NULL
                  rollno       int    NULL
                LastName    string    NULL
                     DOB timestamp    NULL
                     age       int    NULL
 # Partition Information
              # col_name data_type comment
                     age       int    NULL

-- Add a new partition to a table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15

> ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18);

-- After adding a new partition to the table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15
    age=18

-- Drop a partition from the table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15
    age=18

> ALTER TABLE StudentInfo DROP IF EXISTS PARTITION (age=18);

-- After dropping the partition of the table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15

-- Adding multiple partitions to the table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15

> ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);

-- After adding multiple partitions to the table
> SHOW PARTITIONS StudentInfo;
 partition
 ---------
    age=11
    age=12
    age=15
    age=18
    age=20

-- ALTER or CHANGE COLUMNS
> DESCRIBE StudentInfo;
                col_name data_type comment
+-----------------------+---------+-------
                    name    string    NULL
                  rollno       int    NULL
                LastName    string    NULL
                     DOB timestamp    NULL
                     age       int    NULL
 # Partition Information
              # col_name data_type comment
                     age       int    NULL

ALTER TABLE StudentInfo ALTER COLUMN name COMMENT "new comment";

--After ALTER or CHANGE COLUMNS
> DESCRIBE StudentInfo;
                col_name data_type     comment
 ----------------------- --------- -----------
                    name    string new comment
                  rollno       int        NULL
                LastName    string        NULL
                     DOB timestamp        NULL
                     age       int        NULL
 # Partition Information
              # col_name data_type     comment
                     age       int        NULL

-- RENAME COLUMN
> ALTER TABLE StudentInfo RENAME COLUMN name TO FirstName;

--After RENAME COLUMN
> DESCRIBE StudentInfo;
                col_name data_type     comment
 ----------------------- --------- -----------
               FirstName    string new comment
                  rollno       int        NULL
                LastName    string        NULL
                     DOB timestamp        NULL
                     age       int        NULL
 # Partition Information
              # col_name data_type     comment
                     age       int        NULL

-- Change the file Location
> ALTER TABLE dbx.tab1 PARTITION (a='1', b='2') SET LOCATION '/path/to/part/ways'

-- SET TABLE PROPERTIES
> ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('winner' = 'loser');

-- DROP TABLE PROPERTIES
> ALTER TABLE dbx.tab1 UNSET TBLPROPERTIES ('winner');