【问题标题】:BigQuery Drop Table Column - DDL BugBigQuery 删除表列 - DDL 错误
【发布时间】:2021-10-29 06:07:43
【问题描述】:

通过以下方式从表中删除列后:

ALTER TABLE MyTable
DROP COLUMN IF EXISTS MyColumn

在 BigQuery UI 中,我可以看到该列已成功删除,我无法查询特定列,但是当我查询 DDL 时,我可以看到该列仍然存在于方案中:

SELECT DDL FROM MyDataSet.INFORMATION_SCHEMA.TABLES
WHERE DDL LIKE '%MyTable%'

我做错了什么?

【问题讨论】:

    标签: google-bigquery ddl


    【解决方案1】:

    这是 Bigquery 的 Time Travel 的一个令人讨厌的、未记录的副作用。 Time Travel 使在 bigquery 中使用 ALTER TABLE 语句变得不安全。

    问题演示:

    create table apu.time_travel_problem 
    ( id int64
    , name string
    );
    
    select column_name, data_type 
    FROM apu.INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'time_travel_problem';
    
    column_name data_type
    id INT64
    name STRING

    到目前为止这一切都很正常,但是在ALTER TABLE 之后一切都变得奇怪了:

    alter table apu.time_travel_problem drop column name;
    
    select column_name, data_type 
    FROM apu.INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'time_travel_problem';
    
    column_name data_type
    id INT64
    name STRING

    我们刚刚删除的那一列还在!

    现在试试这个:

    alter table apu.time_travel_problem add column name string;
    
    Column `name` was recently deleted in the table `time_travel_problem`. Deleted column name is reserved for up to the time travel duration, use a different column name instead.
    

    解决方案:

    不要在 bigquery 中使用 ALTER TABLE。而是 DROP 和 reCREATE 使用临时表。

    这是我使用的jinja 模板:

    /* {{TABLE}} */
    
    CREATE TABLE  IF NOT EXISTS {{DATASET}}.{{TABLE}}_migration
    OPTIONS (expiration_timestamp = timestamp_add(CURRENT_TIMESTAMP(), INTERVAL 8 HOUR))
    AS SELECT * FROM {{DATASET}}.{{TABLE}};
    
    DROP TABLE {{DATASET}}.{{TABLE}};
    
    CREATE TABLE {{DATASET}}.{{TABLE}}
    (
    {{COLUMN_DDL}}
    );
    
    INSERT INTO {{DATASET}}.{{TABLE}}
    (
    {{COLUMN_LIST}}
    )
    SELECT
    {{COLUMN_LIST}}
    FROM {{DATASET}}.{{TABLE}}_migration;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多