BigQuery 删除 Table 列 - DDL 错误
BigQuery Drop Table Column - DDL Bug
从 table 中删除列后:
ALTER TABLE MyTable
DROP COLUMN IF EXISTS MyColumn
在 BigQuery 中 UI 我可以看到该列已成功删除并且我无法查询特定列但是当我查询 DDL 时我可以看到该列仍然存在于方案中:
SELECT DDL FROM MyDataSet.INFORMATION_SCHEMA.TABLES
WHERE DDL LIKE '%MyTable%'
我做错了什么?
这是 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
使用临时 table.
这是我使用的 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;
从 table 中删除列后:
ALTER TABLE MyTable
DROP COLUMN IF EXISTS MyColumn
在 BigQuery 中 UI 我可以看到该列已成功删除并且我无法查询特定列但是当我查询 DDL 时我可以看到该列仍然存在于方案中:
SELECT DDL FROM MyDataSet.INFORMATION_SCHEMA.TABLES
WHERE DDL LIKE '%MyTable%'
我做错了什么?
这是 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
使用临时 table.
这是我使用的 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;