BigQuery 删除表列 - DDL 错误

问题描述 投票:0回答:2

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

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
2个回答
9
投票

这是 Bigquery 的 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';
列_名称 数据类型
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';
列_名称 数据类型
id INT64
名字 字符串

我们刚刚删除的专栏还在那里!

现在试试这个:

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
和 re
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;

0
投票

要解决此问题,您可以在使用

DROP
之前重命名该列。

-- rename the column to a useless name (I use uuid within python)
ALTER TABLE testing.test2 RENAME COLUMN ColumnName TO NewUselessName;

-- then you can delete the column as expected
ALTER TABLE testing.test2 DROP COLUMN IF EXISTS NewUselessName;

-- you can now create a new column with the same name if you want
-- ALTER TABLE testing.test2 ADD COLUMN ColumnName STRING;

我相信@Steven Ensslen 接受的答案很好地解释了为什么会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.