【发布时间】:2015-07-25 03:28:45
【问题描述】:
我正在尝试截断 GBQ 中的现有表,但以下命令在我运行时失败。是否有任何特定的命令或语法可以做到这一点。我查看了 GBQ 文档,但没有运气。
TRUNCATE TABLE [dw_test.test];
【问题讨论】:
-
自 2020 年 10 月起,bigquery 支持截断表。请检查@Iaol 答案
标签: google-bigquery
我正在尝试截断 GBQ 中的现有表,但以下命令在我运行时失败。是否有任何特定的命令或语法可以做到这一点。我查看了 GBQ 文档,但没有运气。
TRUNCATE TABLE [dw_test.test];
【问题讨论】:
标签: google-bigquery
虽然 BigQuery 过去不支持 SELECTs 以外的任何内容,但现在只要您取消选中查询选项中的“使用旧版 SQL”即可。没有截断,而是you can delete:
DELETE from my_table WHERE 1=1
请注意,BigQuery 要求在 DELETE 中使用 WHERE,因此,如果您想删除所有内容,请使用始终正确的语句。
【讨论】:
Error: 1.1 - 1.58: Unrecognized token DELETE. 这是我尝试此操作时遇到的错误。
Require partition filter 标志创建的(例如通过时间戳列ts),那么您只需要指定一个足够宽的时间窗口来删除所有数据,例如@987654329 @ 否则你会得到一个错误,说如果没有对列 'ts' 的过滤器可以用于分区消除,查询将无法成功。 @XiongChiamiov 你能用这个建议更新你的答案吗?
好消息,现在支持 TRUNCATE TABLE:https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#truncate_table_statement
TRUNCATE TABLE [[project_name.]dataset_name.]table_name
但是,请注意,如果您的表定义需要分区过滤器,这将不起作用/不受支持。
【讨论】:
CREATE OR REPLACE TABLE <dataset>.<table>
AS SELECT * FROM <dataset>.<table> LIMIT 0;
对于分区表,假设您在字段“created_on”上有一个天分区,然后执行以下操作:
CREATE OR REPLACE TABLE <dataset>.<table> PARTITION BY created_on
AS SELECT * FROM <dataset>.<table> WHERE created_on = CURRENT_DATE() LIMIT 0;
【讨论】:
编辑(2020 年 11 月):BigQuery 现在支持其他动词,请查看其他答案以获取更新的解决方案。
BigQuery 不支持将 TRUNCATE 作为查询字符串的一部分。 BQ 支持的唯一 DDL/DML 动词是 SELECT。
一种选择是使用WRITE_TRUNCATE write disposition 运行作业(链接用于查询作业参数,但它在所有具有目标表的作业类型上都受支持)。这将截断表中已有的所有数据并将其替换为作业的结果。
如果您不想用其他数据替换内容或开始工作,最好的选择可能是删除并重新创建具有相同架构的表。
【讨论】:
WRITE_TRUNCATE 处置。在查询编辑器下,单击“显示选项” - 然后将“写入首选项”选项设置为“覆盖表”。
DELETE 或UPDATE。 BigQuery tables are append-only,所以如果你想更新或删除特定的行,你需要用你想要的行重新创建表。这可以通过带有目标表的 SELECT * FROM table WHERE NOT(