Guy*_*Guy 4 ddl google-bigquery
通过以下方式从表中删除列后:
ALTER TABLE MyTable
DROP COLUMN IF EXISTS MyColumn
Run Code Online (Sandbox Code Playgroud)
在 BigQuery UI 中,我可以看到该列已成功删除,并且无法查询特定列,但是当我查询 DDL 时,我可以看到该列仍然存在于方案中:
SELECT DDL FROM MyDataSet.INFORMATION_SCHEMA.TABLES
WHERE DDL LIKE '%MyTable%'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这是 Bigquery 的Time Travel的一个令人讨厌的、未记录的副作用。时间旅行使得ALTER TABLE在 bigquery 中使用语句变得不安全。
问题演示:
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';
Run Code Online (Sandbox Code Playgroud)
| 列名 | 数据类型 |
|---|---|
| ID | INT64 |
| 姓名 | 细绳 |
到目前为止,这一切都很正常,但之后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';
Run Code Online (Sandbox Code Playgroud)
| 列名 | 数据类型 |
|---|---|
| ID | INT64 |
| 姓名 | 细绳 |
我们刚刚删除的专栏仍然存在!
现在试试这个:
alter table apu.time_travel_problem add column name string;
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
解决方案:
不要ALTER TABLE在 bigquery 中使用。相反DROP,重新CREATE使用临时表。
这是我使用的jinja模板:
/* {{TABLE}} */
ALTER TABLE {{DATASET}}.{{TABLE}} RENAME TO {{TABLE}}_migration;
ALTER TABLE {{DATASET}}.{{TABLE}}_migration
SET OPTIONS (expiration_timestamp = timestamp_add(CURRENT_TIMESTAMP(), INTERVAL 8 HOUR))l
CREATE TABLE {{DATASET}}.{{TABLE}}
(
{{COLUMN_DDL}}
);
INSERT INTO {{DATASET}}.{{TABLE}}
(
{{COLUMN_LIST}}
)
SELECT
{{COLUMN_LIST}}
FROM {{DATASET}}.{{TABLE}}_migration;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7188 次 |
| 最近记录: |