标准 SQL 中的数据定义语言 (DDL) 语句
通过数据定义语言 (DDL) 语句,您可以使用标准 SQL 查询语法创建和修改 BigQuery 资源。您可以使用 DDL 命令创建、修改和删除资源,例如表、表克隆、表快照、视图、用户定义的函数 (UDF) 和行级访问权限政策。
所需权限
如需创建运行 DDL 语句的作业,您必须在运行该作业的项目中具有 bigquery.jobs.create
权限。每个 DDL 语句还需要对受影响的资源拥有特定权限,这些权限记录在每个语句下。
IAM 角色
预定义的 IAM 角色 bigquery.user
、bigquery.jobUser
和 bigquery.admin
可提供所需的 bigquery.jobs.create
权限。
如需详细了解 BigQuery 中的 IAM 角色,请参阅预定义角色和权限或 IAM 权限参考文档。
运行 DDL 语句
如需运行 DDL 语句,您可以使用 Cloud Console、bq
命令行工具、调用 jobs.query
REST API 或以编程方式使用 BigQuery API 客户端库。
控制台
转到 Cloud Console 中的 BigQuery 页面。
点击编写新查询。
在查询编辑器文本区域中,输入 DDL 语句。例如:
CREATE TABLE mydataset.newtable ( x INT64 )
点击运行。
bq
输入 bq query
命令并提供 DDL 语句作为查询参数。将 use_legacy_sql
标志设置为 false
。
bq query --use_legacy_sql=false \ 'CREATE TABLE mydataset.newtable ( x INT64 )'
API
调用 jobs.query
方法并在请求正文的 query
属性中提供 DDL 语句。
DDL 功能会扩展作业资源返回的信息。statistics.query.statementType
包含以下其他值以提供 DDL 支持:
CREATE_TABLE
CREATE_TABLE_AS_SELECT
DROP_TABLE
CREATE_VIEW
DROP_VIEW
statistics.query
有 2 个附加字段:
ddlOperationPerformed
:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:CREATE
:查询创建了 DDL 目标。SKIP
:无操作发生。示例 - 提交了CREATE TABLE IF NOT EXISTS
语句,而表已存在。或者提交了DROP TABLE IF EXISTS
语句,而表不存在。REPLACE
:查询替换了 DDL 目标。示例 - 提交了CREATE OR REPLACE TABLE
语句,而表已存在。DROP
:查询删除了 DDL 目标。
ddlTargetTable
:当您提交CREATE TABLE/VIEW
语句或DROP TABLE/VIEW
语句时,以包含 3 个字段的对象形式返回目标表:- “projectId”:字符串
- “datasetId”:字符串
- “tableId”:字符串
Java
调用 BigQuery.create()
方法,启动查询作业。调用 Job.waitFor()
方法,等待 DDL 查询完成。
Node.js
Python
调用 Client.query()
方法,启动查询作业。调用 QueryJob.result()
方法,等待 DDL 查询完成。
CREATE SCHEMA
语句
创建新数据集。
语法
CREATE SCHEMA [ IF NOT EXISTS ] [project_name.]dataset_name [DEFAULT COLLATE collate_specification] [OPTIONS(schema_option_list)]
参数
IF NOT EXISTS
:如果存在同名的数据集,则CREATE
语句无效。无法以OR REPLACE
显示。DEFAULT COLLATE collate_specification
:在架构中创建新表时,该表将继承默认的排序规则规范,除非明确为列指定排序规则规范。如果您稍后使用
ALTER SCHEMA
语句移除或更改此排序规则规范,则系统不会更改此架构中的现有排序规则规范。如果要更新架构中的现有排序规则规范,您必须更改包含该规范的列。project_name
:您要在其中创建数据集的项目的名称。默认为运行此 DDL 语句的项目。dataset_name
:要创建的数据集的名称。schema_option_list
:用于创建数据集的选项列表。
详情
创建数据集的位置就是在查询设置中指定的位置。如需了解详情,请参阅指定位置。
如需详细了解如何创建数据集,请参阅创建数据集。如需了解配额,请参阅数据集限制。
schema_option_list
选项列表指定数据集的选项。请按以下格式指定选项:NAME=VALUE, ...
支持的选项如下:
NAME |
VALUE |
详情 |
---|---|---|
default_kms_key_name |
STRING |
指定用于加密此数据集中的表数据的默认 Cloud KMS 密钥。您可以在创建表时替换此值。 |
default_partition_expiration_days |
FLOAT64 |
指定此数据集中的表分区的默认到期时间(天)。您可以在创建表时替换此值。 |
default_table_expiration_days |
FLOAT64 |
指定此数据集中的表的默认到期时间(天)。您可以在创建表时替换此值。 |
description |
STRING |
数据集的说明。 |
friendly_name |
STRING |
数据集的描述性名称。 |
labels |
<ARRAY<STRUCT<STRING, STRING>>> |
数据集的标签数组,以键值对形式表示。 |
location |
STRING |
要在其中创建数据集的位置。如果未指定此选项,则系统会在查询运行的位置创建数据集。如果您指定了此选项,并明确设置了查询作业的位置,则这两个值必须匹配:否则查询会失败。 |
max_time_travel_hours |
SMALLINT |
处于预览版阶段。 指定数据集的时间旅行窗口的时长(以小时为单位)。 如需详细了解时间旅行窗口,请参阅配置时间旅行窗口。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.datasets.create |
要在其中创建数据集的项目。 |
示例
创建新的架构
以下示例会创建一个使用默认表到期时间和一组标签的数据集。
CREATE SCHEMA mydataset OPTIONS( location="us", default_table_expiration_days=3.75, labels=[("label1","value1"),("label2","value2")] )
创建支持排序规则的架构
以下示例使用排序规则规范创建数据集。
CREATE SCHEMA mydataset DEFAULT COLLATE 'und:ci'
CREATE TABLE
语句
创建新表。
语法
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] TABLE [ IF NOT EXISTS ] table_name [( column[, ...] )] [DEFAULT COLLATE collate_specification] [PARTITION BY partition_expression] [CLUSTER BY clustering_column_list] [OPTIONS(table_option_list)] [AS query_statement]
参数
OR REPLACE
。替换任何同名的表(如果存在)。无法以IF NOT EXISTS
显示。TEMP | TEMPORARY
:创建临时表。IF NOT EXISTS
:如果存在同名的表,则CREATE
语句无效。无法以OR REPLACE
显示。table_name
:要创建的表的名称。请参阅表路径语法。对于临时表,请勿包含项目名称或数据集名称。column
:表的架构信息。collation_specification
:在架构中创建新列时,如果列没有显式排序规则规范,则列将继承STRING
类型的这个排序规范。如果您稍后使用
ALTER TABLE
语句移除或更改此排序规则规范,则系统不会更改此表中的现有排序规则规范。如果要更新表中的现有排序规则规范,您必须更改包含该规范的列。如果表是架构的一部分,则此表的默认排序规则规范会替换架构的默认排序规则规范。
partition_expression
:用于确定如何对表进行分区的表达式。clustering_column_list
:用于确定如何对表进行聚簇的列引用的英文逗号分隔列表。 您不能对此列表中的列执行排序规则。table_option_list
:用于创建表的选项列表。query_statement
:应根据其创建表的查询。如需了解查询语法,请参阅 SQL 语法参考。{: #query_statement } 如果此表使用了排序规则规范,则排序规则会通过此查询语句传递。
详情
CREATE TABLE
语句必须符合以下规则:
- 只允许一个
CREATE
语句。 - 必须存在列列表和/或
as query_statement
子句。 - 当列列表和
as query_statement
子句都存在时,BigQuery 会忽略as query_statement
子句中的名称,并按位置匹配列和列列表。 - 存在
as query_statement
子句但不存在列列表时,BigQuery 会根据as query_statement
子句确定列名称和类型。 - 必须通过列列表、
as query_statement
子句或LIKE
子句中的表架构指定列名称。 - 禁止使用重复的列名称。
LIKE
和as query_statement
子句都存在时,查询语句中的列列表必须与LIKE
子句引用的表列匹配。
限制:
- 无法利用查询结果创建提取时间分区表。请改为使用
CREATE TABLE
DDL 语句来创建表,然后使用INSERT
DML 语句向其中插入数据。 - 无法使用
OR REPLACE
修饰符将表替换为使用不同种类的分区。请先使用DROP
删除表,然后使用CREATE TABLE ... AS SELECT ...
语句重新创建表。
此语句支持以下变体:
CREATE TABLE LIKE
:创建一个与现有表具有相同架构的表。CREATE TABLE COPY
:通过从现有表复制架构和数据来创建表。
column
(column_name column_schema[, ...])
以英文逗号分隔列表的形式提供表的架构信息。
column := column_name column_schema column_schema := { simple_type [NOT NULL] | STRUCT<field_list> [NOT NULL] | ARRAY<array_element_schema> } [OPTIONS(column_option_list)] field_list := field_name column_schema [, ...] array_element_schema := { simple_type | STRUCT<field_list> } [NOT NULL] simple_type := { data_type | STRING COLLATE collate_specification }
column_name
是列的名称。列名称要求:- 只能包含字母(a-z、A-Z)、数字 (0-9) 或下划线 (_)
- 必须以字母或下划线开头
- 最多包含 300 个字符
column_schema
:与数据类型相似,但对于ARRAY
以外的类型,支持可选的NOT NULL
限制。column_schema
还支持顶级列与STRUCT
字段的选项。column_schema
只能在CREATE TABLE
语句的列定义列表中使用,不能在表达式中作为类型使用。适用于simple_type
:除STRUCT
和ARRAY
之外的任何受支持的数据类型。如果
simple_type
是STRING
,则它支持排序规则的一个附加子句,用于定义如何对生成的STRING
进行比较和排序。语法如下所示:STRING COLLATE collate_specification
如果已为表分配了
DEFAULT COLLATE collate_specification
,则列的排序规范会替换表的规范。field_list
:表示结构体中的字段。field_name
:结构体字段的名称。结构体字段名称具有与列名称相同的限制。NOT NULL
:当列或字段存在NOT NULL
限制时,按REQUIRED
模式创建列或字段。相反,没有NOT NULL
限制时,按NULLABLE
模式创建列或字段。ARRAY
类型的列和字段不支持NOT NULL
修饰符。例如,ARRAY<INT64> NOT NULL
的column_schema
无效,因为ARRAY
列具有REPEATED
模式并可为空,但不可为NULL
。无论是否指定NOT NULL
限制,表中的数组元素都不能为NULL
。例如,ARRAY<INT64>
等同于ARRAY<INT64 NOT NULL>
。表的
column_schema
的NOT NULL
特性 (Attribute) 不会通过对表的查询来传播。例如,如果表T
包含声明为x INT64 NOT NULL
的列,CREATE TABLE dataset.newtable AS SELECT x FROM T
会创建名为dataset.newtable
的表,其中x
是NULLABLE
。
partition_expression
PARTITION BY
是控制表分区的可选子句。partition_expression
是确定如何对表进行分区的表达式。分区表达式可包含以下值:
_PARTITIONDATE
。按汲取时间通过每日分区进行分区。此语法不能用于AS query_statement
子句。DATE(_PARTITIONTIME)
。与_PARTITIONDATE
等效。此语法不能用于AS query_statement
子句。<date_column>
。按DATE
列通过每日分区进行分区。DATE({ <timestamp_column> | <datetime_column> })
。按TIMESTAMP
或DATETIME
列通过每日分区进行分区。DATETIME_TRUNC(<datetime_column>, { DAY | HOUR | MONTH | YEAR })
。按DATETIME
列通过指定的分区类型进行分区。TIMESTAMP_TRUNC(<timestamp_column>, { DAY | HOUR | MONTH | YEAR })
。按TIMESTAMP
列通过指定的分区类型进行分区。TIMESTAMP_TRUNC(_PARTITIONTIME, { DAY | HOUR | MONTH | YEAR })
。按汲取时间通过指定的分区类型进行分区。此语法不能用于AS query_statement
子句。DATE_TRUNC(<date_column>, { MONTH | YEAR })
。按DATE
列通过指定的分区类型进行分区。RANGE_BUCKET(<int64_column>, GENERATE_ARRAY(<start>, <end>[, <interval>]))
。按整数列通过指定的范围进行分区,其中:start
是范围分区的起始值(含边界值)。end
是范围分区的终止值(不含边界值)。interval
是分区中每个范围的宽度。 默认为 1。
clustering_column_list
CLUSTER BY
是控制表聚簇的可选子句。clustering_column_list
是确定如何对表进行聚簇的英文逗号分隔列表。聚簇列列表最多可包含 4 个聚簇列。
table_option_list
可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。
请按以下格式指定表选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
partition_expiration_days |
|
示例: 设置分区过期时间(以天为单位)。如需了解详情,请参阅设置分区过期时间。默认情况下,分区不会过期。 此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。 只能对分区表设置此属性。 |
require_partition_filter |
|
示例: 指定此表的查询是否必须包含对分区列进行过滤的谓词过滤条件。如需了解详情,请参阅设置分区过滤条件。默认值为 此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。 只能对分区表设置此属性。 |
kms_key_name |
|
示例: 此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。 请查看有关使用 Cloud KMS 密钥保护数据的详细信息。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
如果 VALUE
评估为 NULL
,则系统会忽略 CREATE TABLE
语句中的相应选项 NAME
。
column_option_list
通过 column_schema
中的 column_option_list
,您可以指定可选的列或字段选项。列选项与表选项的语法和要求相同,但包含的 NAME
和 VALUE
列表不同:
NAME |
VALUE |
详细信息 |
---|---|---|
description |
|
示例: 此属性等效于 schema.fields[].description 表资源属性。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
您在其中创建表的数据集。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
和 bigquery.tables.updateData
权限。
如果 OPTIONS
子句包含任何到期时间选项,则还需要 bigquery.tables.delete
权限。
示例
创建新表
以下示例在 mydataset
中创建名为 newtable
的分区表:
CREATE TABLE mydataset.newtable ( x INT64 OPTIONS(description="An optional INTEGER field"), y STRUCT< a ARRAY<STRING> OPTIONS(description="A repeated STRING field"), b BOOL > ) PARTITION BY _PARTITIONDATE OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", partition_expiration_days=1, description="a table that expires in 2025, with each partition living for 24 hours", labels=[("org_unit", "development")] )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.newtable`
,而不是 mydataset.newtable
。
如果数据集内已存在该表名称,会返回以下错误:
Already Exists: project_id:dataset.table
该表利用以下 partition_expression
对表进行分区:PARTITION BY _PARTITIONDATE
。此表达式使用 _PARTITIONDATE
伪列中的日期对表进行分区。
表架构中包含两列:
- x:整数,带有“可选的整数字段”描述
y:包含两列的 STRUCT:
- a:一组字符串,带有“重复的字符串字段”描述
- b:一个布尔值
表选项列表指定了以下内容:
- 表到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
- 分区到期时间:1 天
- 说明:
A table that expires in 2025
- 标签:
org_unit = development
从现有表创建新表
下面的示例基于查询在 mydataset
中创建名为 top_words
的表:
CREATE TABLE mydataset.top_words OPTIONS( description="Top ten words per Shakespeare corpus" ) AS SELECT corpus, ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words FROM bigquery-public-data.samples.shakespeare GROUP BY corpus;
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.top_words`
,而不是 mydataset.top_words
。
如果数据集内已存在该表名称,会返回以下错误:
Already Exists: project_id:dataset.table
表架构中包含两列:
- corpus:莎士比亚全集的名称
top_words:
STRUCT
类型的ARRAY
,包含两个字段:word
(STRING
类型)和word_count
(表示该单词出现次数的INT64
)
表选项列表指定了以下内容:
- 说明:
Top ten words per Shakespeare corpus
仅当某个表不存在时才创建该表
仅当 mydataset
中不存在名为 newtable
的表时,下述示例才会在 mydataset
中创建名为 newtable
的表。如果数据集中存在该表名称,则不会返回任何错误,也不会执行任何操作。
CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>) OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", description="a table that expires in 2025", labels=[("org_unit", "development")] )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.newtable`
,而不是 mydataset.newtable
。
表架构中包含两列:
- x:整数
y:包含 a(字符串数组)和 b(布尔值)的 STRUCT
表选项列表指定了以下内容:
- 到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
- 说明:
A table that expires in 2025
- 标签:
org_unit = development
创建或替换表
以下示例会在 mydataset
中创建名为 newtable
的表,如果 mydataset
中存在 newtable
,则会用空表覆盖该表。
CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>) OPTIONS( expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC", description="a table that expires in 2025", labels=[("org_unit", "development")] )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.newtable`
,而不是 mydataset.newtable
。
表架构中包含两列:
- x:整数
y:包含 a(字符串数组)和 b(布尔值)的 STRUCT
表选项列表指定了以下内容:
- 到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
- 说明:
A table that expires in 2025
- 标签:
org_unit = development
使用 REQUIRED
列创建表
以下示例在 mydataset
中创建名为 newtable
的表。CREATE TABLE
语句的列定义列表中的 NOT
NULL
修饰符指定以 REQUIRED
模式创建列或字段。
CREATE TABLE mydataset.newtable ( x INT64 NOT NULL, y STRUCT< a ARRAY<STRING>, b BOOL NOT NULL, c FLOAT64 > NOT NULL, z STRING )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.newtable`
,而不是 mydataset.newtable
。
如果数据集内已存在该表名称,会返回以下错误:
Already Exists: project_id:dataset.table
表架构中包含 3 列:
- x:
REQUIRED
整数 - y:
REQUIRED
STRUCT,包含 a(字符串数组)、b(REQUIRED
布尔值)、c(NULLABLE
浮点) z:
NULLABLE
字符串
创建支持排序规则的表
以下示例在 mydataset
中创建包含列 a
、b
、c
的表 newtable
以及包含字段 x
和 y
的结构体。
此表中的所有 STRING
列架构都由 'und:ci'
整理:
CREATE TABLE mydataset.newtable ( a STRING, b STRING, c STRUCT< x FLOAT64 y ARRAY<STRING> > ) DEFAULT COLLATE 'und:ci';
只有 b
和 y
由 'und:ci'
整理:
CREATE TABLE mydataset.newtable ( a STRING, b STRING COLLATE 'und:ci', c STRUCT< x FLOAT64 y ARRAY<STRING COLLATE 'und:ci'> > );
创建具有参数化数据类型的表
以下示例在 mydataset
中创建名为 newtable
的表。括在英文括号中的参数指定的列包含参数化数据类型。如需详细了解参数化类型,请参阅参数化数据类型。
CREATE TABLE mydataset.newtable ( x STRING(10), y STRUCT< a ARRAY<BYTES(5)>, b NUMERIC(15, 2), c FLOAT64 >, z BIGNUMERIC(35) )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。表限定符应是 `myproject.mydataset.newtable`
而不是 mydataset.newtable
。
如果数据集内已存在该表名称,会返回以下错误:
Already Exists: project_id:dataset.table
表架构中包含 3 列:
- x:长度上限为 10 的参数化字符串
- y:包含 a(一个长度上限为 5 的参数化字节数组)、b(最大精度为 15 且最大精度为 2 的参数化 NUMERIC 类型)和 c(浮点数)的 STRUCT
- z:最大精度为 35 且最大精度为 0 的参数化 BIGNUMERIC 类型
创建分区表
以下示例使用一个 DATE
列在 mydataset
中创建名为 newtable
的分区表:
CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE) PARTITION BY transaction_date OPTIONS( partition_expiration_days=3, description="a table partitioned by transaction_date" )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.newtable`
,而不是 mydataset.newtable
。
表架构中包含两列:
- transaction_id:整数
- transaction_date:日期
表选项列表指定了以下内容:
- 分区有效期限:3 天
- 说明:
A table partitioned by transaction_date
从查询结果创建分区表
以下示例使用一个 DATE
列在 mydataset
中创建名为 days_with_rain
的分区表:
CREATE TABLE mydataset.days_with_rain PARTITION BY date OPTIONS ( partition_expiration_days=365, description="weather stations with precipitation, partitioned by day" ) AS SELECT DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date, (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations WHERE stations.usaf = stn) AS station_name, -- Stations can have multiple names prcp FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather WHERE prcp != 99.9 -- Filter unknown values AND prcp > 0 -- Filter stations/days with no precipitation
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.days_with_rain`
,而不是 mydataset.days_with_rain
。
表架构中包含两列:
- date:数据收集的
DATE
- station_name:
STRING
格式的气象站名称 - prcp:
FLOAT64
格式的降雨量(以英寸为单位)
表选项列表指定了以下内容:
- 分区有效期限:一年
- 说明:
Weather stations with precipitation, partitioned by day
创建聚簇表
示例 1
以下示例在 mydataset
中创建名为 myclusteredtable
的聚簇表。该表是分区表,按 TIMESTAMP
列分区,并按名为 customer_id
的 STRING
列进行聚簇。
CREATE TABLE mydataset.myclusteredtable ( timestamp TIMESTAMP, customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(timestamp) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`
,而不是 mydataset.myclusteredtable
。
表架构中包含 3 列:
- timestamp:
TIMESTAMP
格式的数据收集时间 - customer_id:
STRING
格式的客户 ID - transaction_amount:
NUMERIC
格式的交易金额
表选项列表指定了以下内容:
- 分区有效期限:3 天
- 说明:
A table clustered by customer_id
示例 2
以下示例在 mydataset
中创建名为 myclusteredtable
的聚簇表。该表为提取时间分区表。
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(_PARTITIONTIME) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`
,而不是 mydataset.myclusteredtable
。
表架构中包含两列:
- customer_id:
STRING
格式的客户 ID - transaction_amount:
NUMERIC
格式的交易金额
表选项列表指定了以下内容:
- 分区有效期限:3 天
- 说明:
A table clustered by customer_id
示例 3
以下示例在 mydataset
中创建名为 myclusteredtable
的聚簇表。该表未进行分区。
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id OPTIONS ( description="a table clustered by customer_id" )
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`
,而不是 mydataset.myclusteredtable
。
表架构中包含两列:
- customer_id:
STRING
格式的客户 ID - transaction_amount:
NUMERIC
格式的交易金额
表选项列表指定了以下内容:
- 说明:
A table clustered by customer_id
从查询结果创建聚簇表
示例 1
以下示例使用查询结果在 mydataset
中创建名为 myclusteredtable
的聚簇表。该表是按 TIMESTAMP
列分区的分区表。
CREATE TABLE mydataset.myclusteredtable ( timestamp TIMESTAMP, customer_id STRING, transaction_amount NUMERIC ) PARTITION BY DATE(timestamp) CLUSTER BY customer_id OPTIONS ( partition_expiration_days=3, description="a table clustered by customer_id" ) AS SELECT * FROM mydataset.myothertable
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`
,而不是 mydataset.myclusteredtable
。
表架构中包含 3 列:
- timestamp:
TIMESTAMP
格式的数据收集时间 - customer_id:
STRING
格式的客户 ID - transaction_amount:
NUMERIC
格式的交易金额
表选项列表指定了以下内容:
- 分区有效期限:3 天
- 说明:
A table clustered by customer_id
示例 2
以下示例使用查询结果在 mydataset
中创建名为 myclusteredtable
的聚簇表。该表未进行分区。
CREATE TABLE mydataset.myclusteredtable ( customer_id STRING, transaction_amount NUMERIC ) CLUSTER BY customer_id OPTIONS ( description="a table clustered by customer_id" ) AS SELECT * FROM mydataset.myothertable
如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id
包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`
。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`
,而不是 mydataset.myclusteredtable
。
表架构中包含两列:
- customer_id:
STRING
格式的客户 ID - transaction_amount:
NUMERIC
格式的交易金额
表选项列表指定了以下内容:
- 说明:
A table clustered by customer_id
创建临时表
以下示例会创建一个名为 Example
的临时表并将向其插入值。
CREATE TEMP TABLE Example
(
x INT64,
y STRING
);
INSERT INTO Example
VALUES (5, 'foo');
INSERT INTO Example
VALUES (6, 'bar');
SELECT *
FROM Example;
此脚本会返回以下输出:
+-----+---+-----+
| Row | x | y |
+-----+---|-----+
| 1 | 5 | foo |
| 2 | 6 | bar |
+-----+---|-----+
CREATE TABLE LIKE
语句
使用另一个表的所有相同元数据创建一个新表。
语法
CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] table_name LIKE [[project_name.]dataset_name.]source_table_name ... [OPTIONS(table_option_list)]
详情
除了使用 LIKE
子句代替列列表之外,语法与 CREATE TABLE
语法相同。
CREATE TABLE LIKE
语句仅复制源表的元数据。您可以使用 as query_statement
子句向新表中添加数据。
新表在创建后与源表无关;因此对源表的修改不会传播到新表。
默认情况下,新表从源表继承分区、聚簇和选项元数据。您可以使用 SQL 语句中的可选子句来自定义新表中的元数据。例如,如果要为新表指定一组不同的选项,则包含带有选项和值列表的 OPTIONS
子句。此行为与 ALTER TABLE SET OPTIONS
的行为相符。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
您在其中创建表的数据集。 |
bigquery.tables.get |
源表。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
和 bigquery.tables.updateData
权限。
如果 OPTIONS
子句包含任何到期时间选项,则还需要 bigquery.tables.delete
权限。
示例
示例 1
以下示例在 mydataset
中创建名为 newtable
的新表,其元数据与 sourcetable
相同:
CREATE TABLE mydataset.newtable LIKE mydataset.sourcetable
示例 2
以下示例在 mydataset
中创建名为 newtable
的新表,该表具有与 sourcetable
相同的元数据和 SELECT
语句中的数据:
CREATE TABLE mydataset.newtable LIKE mydataset.sourcetable AS SELECT * FROM mydataset.myothertable
CREATE TABLE COPY
语句
创建一个表,使其与另一个表具有相同的元数据和数据。源表可以是表、表克隆或表快照。
语法
CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] table_name COPY source_table_name ... [OPTIONS(table_option_list)]
详情
除了使用 COPY
子句代替列列表之外,语法与 CREATE TABLE
语法相同。
CREATE TABLE COPY
语句会复制源表中的元数据和数据。
新表从源表继承分区和聚簇。默认情况下,源表中的表选项元数据也会被继承,但您可以使用 OPTIONS
子句替换表选项。该行为等同于在复制表后运行 ALTER TABLE SET OPTIONS
。
新表在创建后与源表无关;对源表的修改不会传播到新表。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
您在其中创建表快照的数据集。 |
bigquery.tables.get |
源表。 |
bigquery.tables.getData |
源表。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
和 bigquery.tables.updateData
权限。
如果 OPTIONS
子句包含任何到期时间选项,则还需要 bigquery.tables.delete
权限。
CREATE SNAPSHOT TABLE
语句
语法
CREATE SNAPSHOT TABLE [ IF NOT EXISTS ] table_snapshot_name CLONE source_table_name [FOR SYSTEM_TIME AS OF time_expression] [OPTIONS(snapshot_option_list)]
参数
IF NOT EXISTS
:如果表快照或其他表资源同名,则CREATE
语句无效。table_snapshot_name
:您要创建的表快照的名称。每个数据集的表快照名称必须是唯一的。请参阅表路径语法。source_table_name
:要复制快照的表的名称,或要复制的表快照的名称。请参阅表路径语法。如果源表是标准表,则 BigQuery 会创建源表的表快照。如果源表是表快照,则 BigQuery 会创建表快照的副本。
FOR SYSTEM_TIME AS OF
:您可以选择在由timestamp_expression
指定时间点上的最新表版本。它只能在创建表的快照时使用;不能在复制表快照时使用。snapshot_option_list
:其他表快照创建选项,例如标签和到期时间。
详情
CREATE SNAPSHOT TABLE
语句必须符合以下规则:
- 只允许一个
CREATE
语句。 - 源表必须是以下项之一:
- 表
- 表克隆
- 表快照
FOR SYSTEM_TIME AS OF
子句只能在创建表快照或表克隆时使用;无法在创建表快照的副本时使用。
snapshot_option_list
可通过选项列表设置表快照选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。
请按以下格式指定表快照选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 |
friendly_name |
|
示例: 此属性等效于 |
description |
|
示例: 此属性等效于 |
labels |
|
示例: 此属性等效于 |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
如果 VALUE
评估为 NULL
,则系统会忽略 CREATE SNAPSHOT TABLE
语句中的相应选项 NAME
。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create
|
您在其中创建表快照的数据集。 |
bigquery.tables.createSnapshot |
源表。 |
bigquery.tables.get |
源表。 |
bigquery.tables.getData |
源表。 |
示例
创建表快照:如果已存在则失败
以下示例创建表 myproject.mydataset.mytable
的表快照。表快照在数据集 mydataset
中创建,并命名为 mytablesnapshot
:
CREATE SNAPSHOT TABLE `myproject.mydataset.mytablesnapshot` CLONE `myproject.mydataset.mytable` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="my_table_snapshot", description="A table snapshot that expires in 2 days", labels=[("org_unit", "development")] )
如果数据集内已存在表快照名称,会返回以下错误:
Already Exists: myproject.mydataset.mytablesnapshot
表快照选项列表指定以下内容:
- 到期时间:创建表快照后 48 小时
- 易记名称:
my_table_snapshot
- 说明:
A table snapshot that expires in 2 days
- 标签:
org_unit = development
创建表快照:如果已存在则忽略
以下示例创建表 myproject.mydataset.mytable
的表快照。表快照在数据集 mydataset
中创建,并命名为 mytablesnapshot
:
CREATE SNAPSHOT TABLE IF NOT EXISTS `myproject.mydataset.mytablesnapshot` CLONE `myproject.mydataset.mytable` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="my_table_snapshot", description="A table snapshot that expires in 2 days" labels=[("org_unit", "development")] )
表快照选项列表指定以下内容:
- 到期时间:创建表快照后 48 小时
- 易记名称:
my_table_snapshot
- 说明:
A table snapshot that expires in 2 days
- 标签:
org_unit = development
如果数据集内已存在该表快照名称,则不会执行任何操作,也不会返回错误。
如需了解如何恢复表快照,请参阅 CREATE TABLE CLONE
。
如需了解如何移除表快照,请参阅 DROP SNAPSHOT TABLE
。
CREATE TABLE CLONE
语句
语法
CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] destination_table_name CLONE source_table_name [FOR SYSTEM_TIME AS OF time_expression] ... [OPTIONS(table_option_list)]
详情
除了使用 CLONE
子句代替列列表之外,语法与 CREATE TABLE
语法相同。
参数
OR REPLACE
:替换任何同名的表(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果指定的目标表名称已存在,则CREATE
语句无效。无法以OR REPLACE
显示。
destination_table_name
是您要创建的表的名称。每个数据集的表名称必须唯一。表名称可以包含以下内容:
- 不超过 1024 个字符
- 字母(大写或小写)、数字和下划线
OPTIONS(table_option_list)
可让您指定其他表创建选项,例如标签和到期时间。
source_table_name
是源表的名称。
CREATE TABLE CLONE
语句必须符合以下规则:
- 只允许一个
CREATE
语句。 - 要克隆的表必须是表、表克隆或表快照。
OPTIONS
CREATE TABLE CLONE
选项与 CREATE TABLE
选项相同。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
您在其中创建表克隆的数据集。 |
bigquery.tables.get |
源表。 |
bigquery.tables.getData |
源表。 |
bigquery.tables.restoreSnapshot |
源表(仅当源表为表快照时才需要)。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
和 bigquery.tables.updateData
权限。
如果 OPTIONS
子句包含任何到期时间选项,则还需要 bigquery.tables.delete
权限。
示例
恢复表快照:如果目标表已存在则失败
以下示例根据表快照 myproject.mydataset.mytablesnapshot
创建表 myproject.mydataset.mytable
:
CREATE TABLE `myproject.mydataset.mytable` CLONE `myproject.mydataset.mytablesnapshot` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 365 DAY), friendly_name="my_table", description="A table that expires in 1 year", labels=[("org_unit", "development")] )
如果数据集内已存在该表名称,则会返回以下错误:
Already Exists: myproject.mydataset.mytable.
表选项列表指定以下内容:
- 到期时间:自创建表后 365 天
- 易记名称:
my_table
- 说明:
A table that expires in 1 year
- 标签:
org_unit = development
创建表克隆:如果目标表已存在则忽略
以下示例会基于表 myproject.mydataset.mytable
创建表克隆 myproject.mydataset.mytableclone
:
CREATE TABLE IF NOT EXISTS `myproject.mydataset.mytableclone` CLONE `myproject.mydataset.mytable` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 365 DAY), friendly_name="my_table", description="A table that expires in 1 year", labels=[("org_unit", "development")] )
表选项列表指定以下内容:
- 到期时间:自创建表后 365 天
- 易记名称:
my_table
- 说明:
A table that expires in 1 year
- 标签:
org_unit = development
如果数据集内已存在该表名称,则不会执行任何操作,也不会返回错误。
如需了解如何创建表的副本,请参阅 CREATE TABLE COPY
。
如需了解如何创建表的快照,请参阅 CREATE SNAPSHOT TABLE
。
CREATE VIEW
语句
创建新视图。
语法
CREATE [ OR REPLACE ] VIEW [ IF NOT EXISTS ] view_name [(view_column_name_list)] [OPTIONS(view_option_list)] AS query_expression
参数
OR REPLACE
:替换任何同名的视图(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果视图或其他表资源同名,则CREATE
语句无效。无法以OR REPLACE
显示。view_name
:要创建的视图的名称。请参阅表路径语法。view_column_name_list
:可让您明确指定视图的列名称,它可以是底层 SQL 查询中列名称的别名。view_option_list
:其他视图创建选项,例如标签和到期时间。query_expression
:用于定义视图的标准 SQL 查询表达式。
详情
CREATE VIEW
语句必须符合以下规则:
- 只允许一个
CREATE
语句。
view_column_name_list
视图的列名称列表是可选的。这些名称必须是唯一的,但不必与底层 SQL 查询的列名称相同。例如,如果您的视图是使用以下语句创建的:
CREATE VIEW mydataset.age_groups(age, count) AS SELECT age, COUNT(*)
FROM mydataset.people
group by age;
那么您可以使用以下语句来查询它:
SELECT age, count from mydataset.age_groups;
列名列表中的列数必须与底层 SQL 查询中的列数相匹配。如果在底层 SQL 查询表中添加或移除列,则视图将变为无效并且必须重新创建视图。例如,如果从 mydataset.people
表中删除 age
列,则在上一示例中创建的视图无效。
view_option_list
通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。
请按以下格式指定视图选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
如果 VALUE
评估为 NULL
,则系统会忽略 CREATE VIEW
语句中的相应选项 NAME
。
视图正文中的默认项目
如果视图是在用于运行 CREATE VIEW
语句的项目中创建的,则视图正文 query_expression
可以在不指定项目的情况下引用实体;默认项目是拥有视图的项目。请考虑以下示例查询。
CREATE VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;
在项目 myProject
中运行上述 CREATE VIEW
查询后,您可以运行查询 SELECT * FROM myProject.myDataset.myView
。无论选择哪个项目来运行此 SELECT
查询,引用的表 anotherDataset.myTable
始终会针对项目 myProject
进行解析。
如果视图并非是在用于运行 CREATE VIEW
语句的项目中创建的,则视图正文 query_expression
中的所有引用都必须使用项目 ID 进行限定。例如,如果前面的示例 CREATE VIEW
查询在 myProject
之外的其他项目中运行,则该查询无效。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
在其中创建视图的数据集。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
权限。
如果 OPTIONS
子句包含到期时间,则还需要 bigquery.tables.delete
权限。
示例
创建新视图
以下示例在 mydataset
中创建名为 newview
的视图:
CREATE VIEW `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
如果数据集中存在该视图名称,会返回以下错误:
Already Exists: project_id:dataset.table
视图使用以下标准 SQL 查询进行定义:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
视图选项列表指定了以下内容:
- 到期时间:自创建视图后 48 小时
- 易记名称:
newview
- 说明:
A view that expires in 2 days
- 标签:
org_unit = development
仅当某个视图不存在时才创建该视图
以下示例只有在 mydataset
中不存在名为 newview
的视图时才会在 mydataset
中创建名为 newview
的视图。如果数据集中存在该视图名称,则不会返回任何错误,也不会执行任何操作。
CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
视图使用以下标准 SQL 查询进行定义:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
视图选项列表指定了以下内容:
- 到期时间:自创建视图后 48 小时
- 易记名称:
newview
- 说明:
A view that expires in 2 days
- 标签:
org_unit = development
创建或替换视图
以下示例会在 mydataset
中创建名为 newview
的视图,如果 mydataset
中存在 newview
,会使用指定的查询表达式覆盖该视图。
CREATE OR REPLACE VIEW `myproject.mydataset.newview` OPTIONS( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR), friendly_name="newview", description="a view that expires in 2 days", labels=[("org_unit", "development")] ) AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
视图使用以下标准 SQL 查询进行定义:
SELECT column_1, column_2, column_3 FROM
myproject.mydataset.mytable
视图选项列表指定了以下内容:
- 到期时间:自创建视图后 48 小时
- 易记名称:
newview
- 说明:
A view that expires in 2 days
- 标签:
org_unit = development
CREATE MATERIALIZED VIEW
语句
创建新的具体化视图。
语法
CREATE [ OR REPLACE ] MATERIALIZED VIEW [ IF NOT EXISTS ] materialized_view_name [PARTITION BY partition_expression] [CLUSTER BY clustering_column_list] [OPTIONS(materialized_view_option_list)] AS query_expression
参数
OR REPLACE
:替换具有相同名称的任何具体化视图(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果具体化视图或其他表资源同名,则CREATE
语句无效。无法以OR REPLACE
显示。materialized_view_name
:要创建的具体化视图的名称。请参阅表路径语法。如果从具体化视图名称中省略
project_name
,或者它与运行此 DDL 查询的项目相同,则后者也会用作对query_expression
中的表、函数和其他资源的引用的默认项目。引用的默认项目是固定的,不依赖于将来调用新具体化视图的查询。否则,query_expression
中的所有引用都必须使用项目名称进行限定。每个数据集的具体化视图名称必须是唯一的。
partition_expression
:用于确定如何对表进行分区的表达式。具体化视图只能像query expression
(基表)中的表一样分区。clustering_column_list
:确定如何对具体化视图进行聚簇的列引用的英文逗号分隔列表。materialized_view_option_list
** 可用于指定其他具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。query_expression
:用于定义具体化视图的标准 SQL 查询表达式。
详情
CREATE MATERIALIZED VIEW
语句必须符合以下规则:
- 只允许一个
CREATE
语句。
具体化视图正文中的默认项目
如果具体化视图是在用于运行 CREATE MATERIALIZED VIEW
语句的项目中创建的,则具体化视图正文 query_expression
可以在不指定项目的情况下引用实体;默认项目是拥有具体化视图的项目。请考虑以下示例查询。
CREATE MATERIALIZED VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;
在项目 myProject
中运行上述 CREATE MATERIALIZED VIEW
查询后,您可以运行查询 SELECT * FROM myProject.myDataset.myView
。无论选择哪个项目来运行此 SELECT
查询,引用的表 anotherDataset.myTable
始终会针对项目 myProject
进行解析。
如果具体化视图并非是在用于运行 CREATE VIEW
语句的项目中创建的,则具体化视图正文 query_expression
中的所有引用都必须使用项目 ID 进行限定。例如,如果前面的示例 CREATE MATERIALIZED VIEW
查询在 myProject
之外的其他项目中运行,则该查询无效。
materialized_view_option_list
通过选项列表,您可以设置具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。您可以使用逗号分隔列表添加多个选项。
请按以下格式指定具体化视图选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
enable_refresh |
BOOLEAN |
示例: |
refresh_interval_minutes |
FLOAT64 |
示例: |
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create
|
要在其中创建具体化视图的数据集。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
权限。
如果 OPTIONS
子句包含任何到期时间选项,则还需要 bigquery.tables.delete
权限。
示例
创建新的具体化视图
以下示例在 mydataset
中创建了一个名为 new_mv
的具体化视图:
CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
OPTIONS(
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
friendly_name="new_mv",
description="a materialized view that expires in 2 days",
labels=[("org_unit", "development")],
enable_refresh=true,
refresh_interval_minutes=20
)
AS SELECT column_1, SUM(column_2) AS sum_2, AVG(column_3) AS avg_3
FROM `myproject.mydataset.mytable`
GROUP BY column_1
如果数据集中已存在此具体化视图名称,会返回以下错误:
Already Exists: project_id:dataset.materialized_view
使用 DDL 语句创建具体化视图时,您必须按以下格式指定项目、数据集和具体化视图:`project_id.dataset.materialized_view`
(如果 project_id
包含特殊字符,则包括反引号);例如 `myproject.mydataset.new_mv`
。
具体化视图使用以下标准 SQL 查询进行定义:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
具体化视图选项列表指定了以下内容:
- 到期时间:自创建具体化视图后 48 小时
- 易记名称:
new_mv
- 说明:
A materialized view that expires in 2 days
- 标签:
org_unit = development
- 已启用刷新:true
- 刷新间隔:20 分钟
仅当某个具体化视图不存在时才创建该视图
以下示例仅在 mydataset
中不存在名为 new_mv
的具体化视图时才在 mydataset
中创建名为 new_mv
的具体化视图。如果数据集中存在该具体化视图名称,则不会返回任何错误,也不会执行任何操作。
CREATE MATERIALIZED VIEW IF NOT EXISTS `myproject.mydataset.new_mv`
OPTIONS(
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
friendly_name="new_mv",
description="a view that expires in 2 days",
labels=[("org_unit", "development")],
enable_refresh=false
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
具体化视图使用以下标准 SQL 查询进行定义:
SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`
具体化视图选项列表指定了以下内容:
- 到期时间:自创建视图后 48 小时
- 易记名称:
new_mv
- 说明:
A view that expires in 2 days
- 标签:
org_unit = development
- 已启用刷新:false
使用分区和聚簇创建具体化视图
以下示例在 mydataset
中创建一个名为 new_mv
的具体化视图,按 col_datetime
列进行分区并按 col_int
列进行聚簇:
CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
PARTITION BY DATE(col_datetime)
CLUSTER BY col_int
AS SELECT col_int, col_datetime, COUNT(1) as cnt
FROM `myproject.mydataset.mv_base_table`
GROUP BY col_int, col_datetime
基表 mv_base_table
也必须按 col_datetime
列进行分区。如需了解详情,请参阅使用分区表和聚簇表。
CREATE EXTERNAL TABLE
语句
创建一个新的外部表。
外部表允许 BigQuery 查询存储在 BigQuery 存储空间以外的数据。如需详细了解外部表,请参阅外部数据源简介。
语法
CREATE [ OR REPLACE ] EXTERNAL TABLE [ IF NOT EXISTS ] table_name [( column_name column_schema, ... )] [WITH CONNECTION connection_name] [WITH PARTITION COLUMNS [( partition_column_name partition_column_type, ... )] ] OPTIONS ( external_table_option_list, ... );
参数
OR REPLACE
:替换任何同名的外部表(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果外部表或其他表资源同名,则CREATE
语句无效。无法以OR REPLACE
显示。table_name
:外部表的名称。请参阅表路径语法。column_name
:表中的列名称。column_schema
:指定列的架构。它使用的语法与CREATE TABLE
语句中的column_schema
定义相同。如果您不添加此子句,BigQuery 会自动检测架构。connection_name
:指定具有用于访问外部数据的凭据的连接资源。采用 PROJECT_ID.LOCATION.CONNECTION_ID 形式指定连接名称。如果项目 ID 或位置包含短划线,请将连接名称用英文反引号 (`
) 括起来。partition_column_name
:分区列的名称。如果外部数据使用 Hive 分区布局,请添加此字段。如需了解详情,请参阅支持的数据布局。partition_column_type
:分区列类型。external_table_option_list
:用于创建外部表的选项列表。
详情
CREATE EXTERNAL TABLE
语句不支持创建临时外部表。
如需创建外部分区表,请使用 WITH PARTITION COLUMNS
子句指定分区架构的详细信息。BigQuery 会根据外部数据位置验证列定义。架构声明必须严格遵循外部路径中的字段顺序。如需详细了解外部分区,请参阅查询外部分区数据。
external_table_option_list
此选项列表指定用于创建外部表的选项。您必须提供 format
和 uris
选项。请按以下格式指定选项列表:NAME=VALUE, ...
选项 | |
---|---|
allow_jagged_rows |
如果为 适用于 CSV 数据。 |
allow_quoted_newlines |
如果为 适用于 CSV 数据。 |
compression |
数据源的压缩类型。支持的值包括: 适用于 CSV 和 JSON 数据。 |
description |
此表的说明。 |
enable_logical_types |
如果为 适用于 Avro 数据。 |
encoding |
数据的字符编码。支持的值包括: 适用于 CSV 数据。 |
expiration_timestamp |
此表的到期时间。如果未指定,则该表不会过期。 示例: |
field_delimiter |
CSV 文件中的字段的分隔符。 适用于 CSV 数据。 |
format |
外部数据的格式。支持的值包括: 值 |
decimal_target_types |
确定如何转换 示例: |
json_extension |
对于 JSON 数据,指示特定的 JSON 交换格式。如果未指定,BigQuery 会以通用 JSON 记录的形式读取数据。 支持的值包括: |
hive_partition_uri_prefix |
分区键编码开始之前所有源 URI 的通用前缀。仅适用于 Hive 分区的外部表。 适用于 Avro、CSV、JSON、Parquet、ORC 数据。 示例: |
ignore_unknown_values |
如果为 适用于 CSV 和 JSON 数据。 |
max_bad_records |
读取数据时要忽略的错误记录数上限。 适用于 CSV、JSON、表格数据。 |
null_marker |
表示 CSV 文件中 适用于 CSV 数据。 |
projection_fields |
要加载的实体属性的列表。 适用于 Datastore 数据。 |
quote |
用于括起 CSV 文件中数据部分的字符串。如果您的数据包含括起的换行符,另请将 适用于 CSV 数据。 |
require_hive_partition_filter |
如果为 适用于 Avro、CSV、JSON、Parquet、ORC 数据。 |
sheet_range |
要查询的表格的电子表格范围。 适用于表格数据。 示例: |
skip_leading_rows |
读取数据时要跳过的文件顶部行数。 适用于 CSV 和表格数据。 |
uris |
外部数据位置的完全限定 URI 数组。 示例: |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.create |
您在其中创建外部表的数据集。 |
此外,OR REPLACE
子句需要 bigquery.tables.update
权限。
如果 OPTIONS
子句包含到期时间,则还需要 bigquery.tables.delete
权限。
示例
以下示例通过多个 URI 创建外部表。数据格式为 CSV。此示例使用架构自动检测功能。
CREATE EXTERNAL TABLE dataset.CsvTable OPTIONS (
format = 'CSV',
uris = ['gs://bucket/path1.csv', 'gs://bucket/path2.csv']
);
下面的示例将根据 CSV 文件创建外部表并明确指定架构。此外,它还会指定字段分隔符 ('|'
) 并设置允许的错误记录数上限。
CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
x INT64,
y STRING
)
OPTIONS (
format = 'CSV',
uris = ['gs://bucket/path1.csv'],
field_delimiter = '|',
max_bad_records = 5
);
下面的示例将创建一个外部分区表。它使用架构自动检测功能来检测文件架构和 Hive 分区布局。
例如,如果外部路径是 gs://bucket/path/field_1=first/field_2=1/data.csv
,则分区列将是 field_1
(STRING
) 和 field_2
(INT64
)。
CREATE EXTERNAL TABLE dataset.AutoHivePartitionedTable
WITH PARTITION COLUMNS
OPTIONS (
uris=['gs://bucket/path/*'],
format=csv,
hive_partition_uri_prefix='gs://bucket/path'
);
下面的示例将通过明确指定分区列来创建外部分区表。此示例假定外部文件路径的格式为 gs://bucket/path/field_1=first/field_2=1/data.csv
。
CREATE EXTERNAL TABLE dataset.CustomHivePartitionedTable
WITH PARTITION COLUMNS (
field_1 STRING, -- column order must match the external path
field_2 INT64
)
OPTIONS (
uris=['gs://bucket/path/*'],
format=csv,
hive_partition_uri_prefix='gs://bucket/path'
);
CREATE FUNCTION
语句
创建一个新的用户定义的函数 (UDF)。BigQuery 支持使用 SQL 或 JavaScript 编写的 UDF。
语法
如需创建 SQL UDF,请使用以下语法:
CREATE [ OR REPLACE ] [ TEMPORARY | TEMP ] FUNCTION [ IF NOT EXISTS ] [[project_name.]dataset_name.]function_name ([named_parameter[, ...]]) ([named_parameter[, ...]]) [RETURNS data_type] AS (sql_expression) named_parameter: param_name param_type
如需创建 JavaScript UDF,请使用以下语法:
CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS] [[project_name.]dataset_name.]function_name ([named_parameter[, ...]]) RETURNS data_type [determinism_specifier] LANGUAGE js [OPTIONS (function_option_list)] AS javascript_code named_parameter: param_name param_type determinism_specifier: { DETERMINISTIC | NOT DETERMINISTIC }
如需创建远程函数,请使用以下语法:
CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] [[project_name.]dataset_name.]function_name ([named_parameter[, ...]]) RETURNS data_type REMOTE WITH CONNECTION connection_path [OPTIONS (function_option_list)] named_parameter: param_name param_type
例程名称只能包含字母、数字和下划线,长度不超过 256 个字符。
参数
OR REPLACE
:替换任何同名的函数(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果存在同名的数据集,则CREATE
语句无效。无法以OR REPLACE
显示。TEMP
或TEMPORARY
:创建临时函数。如果子句不存在,则该语句将创建永久性 UDF。您可以在多个查询间重复使用永久性 UDF,但只能在单个查询、脚本或过程中使用临时性 UDF。project_name
。对于永久性函数,是指您要在其中创建函数的项目的名称。默认为运行此 DDL 查询的项目。请勿包括临时性函数的项目名称。dataset_name
。对于永久性函数,是指您要在其中创建函数的数据集的名称。默认为请求中的defaultDataset
。请勿包括临时性函数的数据集名称。function_name
。函数的名称。named_parameter
:使用英文逗号分隔的param_name
和param_type
对。param_type
的值为 BigQuery 数据类型。对于 SQL UDF,param_type
的值也可以是ANY TYPE
。determinism_specifier
:仅适用于 JavaScript UDF。向 BigQuery 提供关于是否可缓存查询结果的提示。可以是下列值之一:DETERMINISTIC
:传递相同的参数时,函数始终返回相同的结果。查询结果可能可缓存。例如,如果函数add_one(i)
始终返回i + 1
,则该函数是确定性函数。NOT DETERMINISTIC
:在传递相同的参数时,函数并不总是返回相同的结果,因此无法缓存。例如,如果函数add_random(i)
返回i + rand()
,则该函数不是确定性的,并且 BigQuery 不会使用缓存的结果。如果调用的所有函数均为
DETERMINISTIC
,则 BigQuery 将尝试缓存结果,除非由于其他原因无法缓存结果。如需了解详情,请参阅使用缓存的查询结果。
data_type
:函数返回的数据类型。- 如果函数是使用 SQL 定义的,则
RETURNS
为可选子句。如果省略RETURNS
子句,则当查询调用函数时,BigQuery 会通过 SQL 函数体推断出函数的结果类型。 - 如果函数是使用 JavaScript 定义的,则需要
RETURNS
子句。如需详细了解可使用的data_type
值,请参阅支持的 JavaScript UDF 数据类型。
- 如果函数是使用 SQL 定义的,则
sql_expression
:用于定义函数的 SQL 表达式。function_option_list
。用于创建函数的选项列表。javascript_code
:JavaScript 函数的定义。 该值为字符串字面量。如果代码包含英文引号和反斜杠,则必须进行转义或表示为原始字符串。例如,代码return "\n";
可以表示为以下之一:- 带英文引号的字符串
"return \"\\n\";"
。英文引号和反斜杠都需要进行转义。 - 带英文三引号的字符串:
"""return "\\n";"""
。反斜杠需要进行转义,而英文引号不需要。 - 原始字符串:
r"""return "\n";"""
。无需进行转义。
- 带英文引号的字符串
connection_name
:指定具有可访问远程端点的凭据的连接资源。指定连接名称,格式为project_name.location.connection_id
。如果项目名称或位置包含短划线,请将连接名称用英文反引号 (`
) 括起来。
function_option_list
此选项列表指定用于创建 UDF 的选项。支持的选项如下:
NAME |
VALUE |
详情 |
---|---|---|
description |
|
UDF 的说明。 |
library |
|
要包含在函数定义中的 JavaScript 库数组。仅适用于 JavaScript UDF。如需了解详情,请参阅包含 JavaScript 库。 示例: |
endpoint |
|
Cloud Functions 的 HTTP 端点。仅适用于远程函数。 示例: 如需了解详情,请参阅创建远程函数。 |
user_defined_context |
|
调用函数时将随每个 HTTP 请求一起发送的键值对列表。仅适用于远程函数。 示例: |
max_batching_rows |
|
每个 HTTP 请求中的行数上限。如果未指定该选项,BigQuery 会自行确定 HTTP 请求中包含的行数。仅适用于远程函数。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.create |
您在其中创建函数的数据集。 |
此外,OR REPLACE
子句需要 bigquery.routines.update
权限。
如需创建远程函数,您需要具有额外的 IAM 权限:
权限 | 资源 |
---|---|
bigquery.connections.delegate
|
用于创建远程函数的连接。 |
示例
创建 SQL UDF
以下示例会在名为 mydataset
的数据集中创建一个名为 multiplyInputs
的永久性 SQL UDF。
CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
AS (x * y);
创建 JavaScript UDF
以下示例会创建一个名为 multiplyInputs
的临时性 JavaScript UDF,并从 SELECT
语句中对其进行调用。
CREATE TEMP FUNCTION multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS r"""
return x*y;
""";
SELECT multiplyInputs(a, b) FROM (SELECT 3 as a, 2 as b);
创建远程函数
以下示例会在名为 mydataset
的数据集中创建一个名为 remoteMultiplyInputs
的永久性远程函数,这里会假定 mydataset
位于 US
并且 myconnection
连接位于同一位置的相同项目中。
CREATE FUNCTION mydataset.remoteMultiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
REMOTE WITH CONNECTION us.myconnection
OPTIONS(endpoint="https://us-central1-myproject.cloudfunctions.net/multiply");
CREATE TABLE FUNCTION
语句
创建新的表函数(也称为“”表值函数 (TVF))。
语法
CREATE [ OR REPLACE ] TABLE FUNCTION [ IF NOT EXISTS ] [[project_name.]dataset_name.]function_name ( [ function_parameter [, ...] ] ) [RETURNS TABLE < column_declaration [, ...] > ] AS sql_query function_parameter: parameter_name { data_type | ANY TYPE } column_declaration: column_name data_type
参数
OR REPLACE
:替换任何同名的表函数(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果存在任何同名的表函数,则CREATE
语句无效。无法以OR REPLACE
显示。project_name
:要在其中创建函数的项目的名称。默认为运行此 DDL 语句的项目。dataset_name
:要在其中创建函数的数据集的名称。function_name
:要创建的函数的名称。function_parameter
:函数的参数,指定为参数名称和数据类型。data_type
的值是标量 BigQuery 数据类型或ANY TYPE
。RETURNS TABLE
:函数返回的表的架构,此标志指定为列名称和数据类型对的逗号分隔列表。如果RETURNS TABLE
不存在,则 BigQuery 会通过函数正文中的查询语句推断输出架构。如果包含RETURNS TABLE
,则所返回表类型中的名称必须与 SQL 查询中的列名称匹配。sql_query
:指定要运行的 SQL 查询。SQL 查询必须包含所有列的名称。
详情
BigQuery 会尽可能强制转换参数类型。例如,如果参数类型为 FLOAT64
并且传递 INT64
值,则 BigQuery 会将其强制转换为 FLOAT64
。
如果参数类型为 ANY TYPE
,则该函数接受此参数的任何类型的输入。您传递给函数的类型必须与函数定义兼容。如果您传递的参数类型不兼容,则查询会返回错误。如果多个参数的类型为 ANY TYPE
,则 BigQuery 不会在这些参数之间强制执行任何类型关系。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.create
|
您在其中创建表函数的数据集。 |
此外,OR REPLACE
子句需要 bigquery.routines.update
权限。
示例
以下表函数接受用于过滤查询结果的 INT64
参数:
CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS
SELECT year, name, SUM(number) AS total
FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE year = y
GROUP BY year, name
以下示例在 RETURNS
子句中指定返回 TABLE
类型:
CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64) RETURNS TABLE<name STRING, year INT64, total INT64> AS SELECT year, name, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE year = y GROUP BY year, name
CREATE PROCEDURE
语句
创建一个新过程,该过程是可以从其他查询调用的语句块。 过程可以递归调用自身。
语法
CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS] [[project_name.]dataset_name.]procedure_name (procedure_argument[, ...] ) [OPTIONS(procedure_option_list)] BEGIN multi_statement_query END; procedure_argument: [procedure_argument_mode] argument_name argument_type
procedure_argument_mode: IN | OUT | INOUT
参数
OR REPLACE
:替换任何同名的过程(如果存在)。无法以IF NOT EXISTS
显示。IF NOT EXISTS
:如果存在同名过程,则CREATE
语句无效。无法以OR REPLACE
显示。project_name
**:您要在其中创建过程的项目的名称。 默认为运行此 DDL 查询的项目。如果项目名称包含特殊字符(例如英文冒号),则应使用反引号`
将项目名称括起来(示例:`google.com:my_project`
)。dataset_name
:您要在其中创建过程的数据集的名称。默认为请求中的defaultDataset
。procedure_name
:要创建的过程的名称。multi_statement_query
:要运行的多语句查询。argument_type
:任何有效的 BigQuery 类型。procedure_argument_mode
:指定参数是输入还是输出,或者既是输入又是输出。
procedure_option_list
procedure_option_list
可让您指定过程选项。过程选项与表选项的语法和要求相同,但包含的 NAME
和 VALUE
列表不同:
NAME |
VALUE |
详细信息 |
---|---|---|
strict_mode |
|
示例: 如果 虽然 如果 默认值为 |
参数模式
IN
指示参数只是过程的输入。您可以为 IN
参数指定变量或值表达式。
OUT
指示参数是过程的输出。过程开始时,OUT
参数会初始化为 NULL
。您必须为 OUT
参数指定变量。
INOUT
指示参数既是过程的输入,也是过程的输出。您必须为 INOUT
参数指定变量。您可以在过程正文中将 INOUT
参数作为变量引用,并且可以为该参数赋予新值。
如果未指定 IN
、OUT
、INOUT
,则参数会被视为 IN
参数。
变量范围
如果变量是在某个过程之外声明的,并且作为 INOUT 或 OUT 参数传递给该过程,而该过程为该变量赋予了新值,则该新值在该过程之外可见。
在某个过程中声明的变量在该过程之外不可见,反之亦然。
您可以使用 SET
为 OUT
或 INOUT
参数赋值,在这种情况下,修改后的值在相应过程之外可见。如果该过程成功退出,则 OUT
或 INOUT
参数的值是赋予该 INOUT
变量的最终值。
由于临时表存在于脚本的生命周期内,因此,如果某个过程创建了临时表,则该过程的调用者也可以引用该临时表。
过程正文中的默认项目
过程正文可以在不指定项目的情况下引用实体;默认项目是拥有该过程的项目,而不一定是用于运行 CREATE PROCEDURE
语句的项目。请考虑以下示例查询。
CREATE PROCEDURE myProject.myDataset.QueryTable()
BEGIN
SELECT * FROM anotherDataset.myTable;
END;
创建上述过程后,您可以运行查询 CALL myProject.myDataset.QueryTable()
。无论选择哪个项目来运行此 CALL
查询,引用的表 anotherDataset.myTable
始终会针对项目 myProject
进行解析。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.create |
您在其中创建过程的数据集。 |
此外,OR REPLACE
子句需要 bigquery.routines.update
权限。
示例
以下示例会创建一个过程,该过程既接收 x
作为输入参数,又返回 x
作为输出;由于参数 delta
没有参数模式,因此该参数是输入参数。该过程由一个包含单一语句的块组成,该语句将这两个输入参数的总和赋予 x
。
CREATE PROCEDURE mydataset.AddDelta(INOUT x INT64, delta INT64)
BEGIN
SET x = x + delta;
END;
以下示例会调用上述示例中的 AddDelta
过程,并将变量 accumulator
传递给该过程两次;由于 AddDelta
内部对 x
的更改在 AddDelta
之外可见,因此这些过程调用使 accumulator
总共增加了 8。
DECLARE accumulator INT64 DEFAULT 0;
CALL mydataset.AddDelta(accumulator, 5);
CALL mydataset.AddDelta(accumulator, 3);
SELECT accumulator;
此示例会返回以下内容:
+-------------+
| accumulator |
+-------------+
| 8 |
+-------------+
以下示例会创建过程 SelectFromTablesAndAppend
,该过程接收 target_date
作为输入参数,并返回 rows_added
作为输出。该过程会基于查询创建临时表 DataForTargetDate
,然后计算 DataForTargetDate
中的行数并将结果赋予 rows_added
。接下来,该过程会在 TargetTable
中插入一个新行,并将 target_date
的值作为列名之一传递。最后,该过程会删除 DataForTargetDate
表并返回 rows_added
。
CREATE PROCEDURE mydataset.SelectFromTablesAndAppend(
target_date DATE, OUT rows_added INT64)
BEGIN
CREATE TEMP TABLE DataForTargetDate AS
SELECT t1.id, t1.x, t2.y
FROM dataset.partitioned_table1 AS t1
JOIN dataset.partitioned_table2 AS t2
ON t1.id = t2.id
WHERE t1.date = target_date
AND t2.date = target_date;
SET rows_added = (SELECT COUNT(*) FROM DataForTargetDate);
SELECT id, x, y, target_date -- note that target_date is a parameter
FROM DataForTargetDate;
DROP TABLE DataForTargetDate;
END;
以下示例会声明变量 rows_added
,然后将其作为参数(连同 CURRENT_DATE
的值)传递给上一示例中的 SelectFromTablesAndAppend
过程,最后,该示例会返回一条说明添加了多少行的消息。
DECLARE rows_added INT64;
CALL mydataset.SelectFromTablesAndAppend(CURRENT_DATE(), rows_added);
SELECT FORMAT('Added %d rows', rows_added);
CREATE ROW ACCESS POLICY
语句
创建或替换行级访问权限政策。表的行级访问权限政策必须具有唯一名称。
语法
CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ]
row_access_policy_name ON table_name
[GRANT TO (grantee_list)]
FILTER USING (filter_expression);
参数
IF NOT EXISTS
:如果存在同名的行级访问权限政策,则CREATE
语句无效。无法以OR REPLACE
显示。row_access_policy_name
:您要创建的行级访问权限政策的名称。每个表的行级访问政策名称必须是唯一的。行级访问权限政策名称可以包含以下内容:- 不超过 256 个字符。
- 字母(大写或小写)、数字和下划线。必须以字母开头。
table_name
:要为其创建行级访问权限政策的表的名称。该表必须已经存在。GRANT TO grantee_list
:可选子句,它指定应该用于创建行级访问权限政策的初始成员。grantee_list
是iam_member
用户或群组的列表。字符串必须是有效的 IAM 主帐号,或者采用 IAM 政策绑定成员格式的成员,并且必须用引号括起来。系统支持以下类型:grantee_list
类型user:{emailid}
表示特定 Google 帐号的电子邮件地址。
示例:
user:alice@example.com
serviceAccount:{emailid}
表示服务帐号的电子邮件地址。
示例:
serviceAccount:my-other-app@appspot.gserviceaccount.com
group:{emailid}
表示 Google 群组的电子邮件地址。
示例:
group:admins@example.com
domain:{domain}
Google Workspace 网域(主网域),表示该网域中的所有用户。
示例:
domain:example.com
allAuthenticatedUsers
一个特殊的标识符,表示所有服务帐号和互联网上已使用 Google 帐号进行身份验证的所有用户。此标识符包括未关联到 Google Workspace 或 Cloud Identity 网域的帐号,如个人 Gmail 帐号。不包括未经身份验证的用户,例如匿名访问者。 allUsers
一个特殊的标识符,表示互联网上的任何用户,包括经过身份验证和未经过身份验证的用户。由于 BigQuery 要求进行身份验证,然后用户才能访问该服务,因此 allUsers
仅包括经过身份验证的用户。如果一系列
iam_member
值是用英文逗号分隔的并分别用引号括起来,则可以将它们组合起来。例如:"user:alice@example.com","group:admins@example.com","user:sales@example.com"
filter_expression
:定义仅向grantee_list
成员显示的表行的子集。filter_expression
类似于SELECT
查询中的WHERE
子句。以下是有效的过滤条件表达式:
- BigQuery 标准 SQL 标量函数、聚合函数和分析函数。
SESSION_USER()
,用于将访问权限限制为仅属于运行查询的用户的行。如果所有行级访问权限政策都不适用于运行查询的用户,则该用户无权访问表中的数据。TRUE
。向grantee_list
字段中的主帐号授予对表的所有行的访问权限。
过滤条件表达式不能包含以下内容:
- 对表的引用。
- 子查询和 SQL 语句,如
SELECT
、CREATE
或UPDATE
。 - 用户定义的函数。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.rowAccessPolicies.create |
目标表。 |
bigquery.rowAccessPolicies.setIamPolicy |
目标表。 |
bigquery.tables.getData |
目标表。 |
示例
CREATE CAPACITY
语句
通过创建新的容量承诺购买槽。
语法
CREATE CAPACITY project_id.location_id.commitment_id AS JSON capacity_json_object
参数
project_id
:保持此承诺所有权的管理项目的 ID。location_id
:项目的位置。commitment_id
:承诺的 ID。每个项目和位置的该值必须唯一。该字段必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。capacity_json_object
:描述容量承诺的 JSON 字符串。
capacity_json_object
指定包含以下字段的 JSON 对象:
NAME |
TYPE |
详情 |
---|---|---|
plan |
字符串 | 要购买的承诺方案。支持的值包括:FLEX 、MONTHLY 、ANNUAL 。如需了解详情,请参阅承诺方案。 |
renewal_plan |
字符串 | 承诺续订方案。仅在 plan 为 ANNUAL 时适用。如需了解详情,请参阅续订承诺。 |
slot_count |
整数 | 承诺中的槽数。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.capacityCommitments.create
|
维持承诺所有权的管理项目。 |
示例
以下示例将创建一个位于 region-us
区域并由 admin_project
项目管理的 100 个灵活槽的容量承诺:
CREATE CAPACITY `admin_project.region-us.my-commitment`
AS JSON """{
"slot_count": 100,
"plan": "FLEX"
}"""
CREATE RESERVATION
语句
创建预留。 如需了解详情,请参阅预留简介。
语法
CREATE RESERVATION project_id.location_id.reservation_id AS JSON reservation_json_object
参数
project_id
:创建容量承诺的管理项目的 ID。location_id
:项目的位置。reservation_id
:预留 ID。reservation_json_object
:描述预留的 JSON 字符串。
reservation_json_object
指定包含以下字段的 JSON 对象:
NAME |
TYPE |
详情 |
---|---|---|
ignore_idle_slots |
布尔值 | 如果值为 true ,则预留仅使用已预配的槽。默认值为 false 。
如需了解详情,请参阅空闲槽。 |
slot_capacity |
整数 | 要分配给预留的槽数。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.reservations.create
|
维持承诺所有权的管理项目。 |
示例
以下示例将在项目 admin_project
中创建 100 个槽的预留:
CREATE RESERVATION `admin_project.region-us.prod`
AS JSON """{
"slot_capacity": 100
}"""
CREATE ASSIGNMENT
语句
将项目、文件夹或组织分配到预留。
语法
CREATE ASSIGNMENT project_id.location_id.reservation_id.assignment_id AS JSON assignment_json_object
参数
project_id
:创建预留的管理项目的 ID。location_id
:项目的位置。reservation_id
:预留 ID。assignment_id
:分配的 ID。每个项目和位置的该值必须唯一。该字段必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。assignment_json_object
:描述分配的 JSON 字符串。
如需从任何预留中移除项目并改用按需结算,请将 reservation_id
设置为 none
。
assignment_json_object
指定包含以下字段的 JSON 对象:
NAME |
TYPE |
详情 |
---|---|---|
assignee |
字符串 | 要分配给预留的项目、文件夹或组织的 ID。 |
job_type |
字符串 | 要分配给此预留的作业类型。支持的值包括 QUERY 、PIPELINE 和 ML_EXTERNAL 。如需了解详情,请参阅分配。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.reservationAssignments.create
|
管理项目和分配对象。 |
示例
以下示例将 my_project
项目分配给查询作业的 prod
预留:
CREATE ASSIGNMENT `admin_project.region-us.prod.my_assignment`
AS JSON """{
"assignee": "projects/my_project",
"job_type": "QUERY"
}"""
以下示例将组织分配到流水线作业(如加载和导出作业)的 prod
预留:
CREATE ASSIGNMENT `admin_project.region-us.prod.my_assignment`
AS JSON """{
"assignee": "organizations/1234",
"job_type": "PIPELINE"
}"""
CREATE SEARCH INDEX
语句
在表的一个或多个列上创建新的搜索索引。
搜索索引使用 SEARCH
函数来实现高效查询。
语法
CREATE SEARCH INDEX [ IF NOT EXISTS ] index_name ON table_name({ALL COLUMNS | column_name [, ...]})
参数
IF NOT EXISTS
:如果表中已存在使用该名称的索引,则不执行任何操作。如果表具有不同名称的索引,则返回错误。index_name
:您要创建的索引的名称。由于索引始终在基表所在的项目和数据集中创建,因此无需在名称中指定这些内容。table_name
:表格的名称。 请参阅表路径语法。ALL COLUMNS
:针对表中包含STRING
字段的每一列创建索引。column_name
:表中顶级列的名称,为STRING
或包含STRING
字段。该列必须是以下类型之一:STRING
ARRAY<STRING>
STRUCT
,至少包含一个类型为STRING
或ARRAY<STRING>
的嵌套字段JSON
详情
每个基表只能创建一个索引。您无法在视图或具体化视图上创建索引。如需修改要编入索引的列,请 DROP
当前索引并创建新索引。
如果任何 column_name
不是 STRING
或不包含 STRING
字段,或者对不包含 STRING
字段的表的 ALL COLUMNS
调用 CREATE SEARCH INDEX
,则 BigQuery 将返回错误。
对于具有列 ACL 或行过滤条件的表,创建索引将失败;但是,这些过滤条件可在创建索引后添加到表中。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.createIndex |
创建索引所在的基表。 |
示例
以下示例在 my_table
的所有字符串列上创建名为 my_index
的索引。这种情况下,仅在 a
列上创建索引。
CREATE TABLE dataset.my_table(a STRING, b INT64); CREATE SEARCH INDEX my_index ON dataset.my_table(ALL COLUMNS);
以下示例在 a
、my_struct.string_field
和 b
列上创建索引。
CREATE TABLE dataset.complex_table(
a STRING,
my_struct STRUCT<string_field STRING, int_field INT64>,
b ARRAY<STRING>
);
CREATE SEARCH INDEX my_index
ON dataset.complex_table(a, my_struct, b);
ALTER SCHEMA SET DEFAULT COLLATE
语句
为数据集设置排序规则规范。
语法
ALTER SCHEMA [IF EXISTS] [project_name.]dataset_name SET DEFAULT COLLATE collate_specification
参数
IF EXISTS
:如果不存在具有该名称的数据集,则语句无效。DEFAULT COLLATE collate_specification
:在架构中创建新表时,该表将继承默认的排序规则规范,除非明确为列指定排序规则规范。更新后的排序规则规范仅适用于之后创建的表。如果要更新现有排序规则规范,您必须更改包含该规范的列。
project_name
:包含数据集的项目的名称默认为运行此 DDL 语句的项目。dataset_name
:数据集的名称。collate_specification
:指定要设置的排序规则规范。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.datasets.get |
要更改的数据集。 |
bigquery.datasets.update |
要更改的数据集。 |
示例
假设您在名为 mydataset
的架构中有一个现有表 mytable_a
。例如:
CREATE SCHEMA mydataset
CREATE TABLE mydataset.mytable_a ( number INT64, word STRING )
+----------------------+
| mydataset.mytable_a |
| number INT64 |
| word STRING |
+----------------------+
稍后,您决定向架构添加排序规则规范。例如:
ALTER SCHEMA mydataset SET DEFAULT COLLATE 'und:ci'
如果为架构创建新表,则该表将为所有 STRING
列继承 COLLATE 'und:ci'
。例如,在 mydataset
架构中创建 mytable_b
表时,排序规则会添加到 characters
:
CREATE TABLE mydataset.mytable_b ( amount INT64, characters STRING )
+--------------------------------------+
| mydataset.mytable_b |
| amount INT64 |
| characters STRING COLLATE 'und:ci' |
+--------------------------------------+
不过,尽管您更新了架构的排序规则规范,但现有表 mytable_a
会继续使用之前的排序规则规范。例如:
+---------------------+
| mydataset.mytable_a |
| number INT64 |
| word STRING |
+---------------------+
如果要更新 mytable_a
中 word
列的排序规则规范,您必须直接更改该列。例如:
ALTER TABLE mydataset.mytable_a ALTER COLUMN word SET DATA TYPE STRING COLLATE 'und:ci';
+--------------------------------+
| mydataset.mytable_a |
| number INT64 |
| word STRING COLLATE 'und:ci' |
+--------------------------------+
ALTER SCHEMA SET OPTIONS
语句
设置数据集的选项。
如果数据集存在,则除非您在查询设置中指定了位置,否则语句会在数据集的位置运行。如需了解详情,请参阅指定位置。
语法
ALTER SCHEMA [IF EXISTS] [project_name.]dataset_name SET OPTIONS(schema_set_options_list)
参数
IF EXISTS
:如果不存在具有该名称的数据集,则语句无效。project_name
:包含数据集的项目的名称默认为运行此 DDL 语句的项目。dataset_name
:数据集的名称。schema_set_options_list
:要设置的选项列表。
schema_set_options_list
选项列表指定数据集的选项。请按以下格式指定选项:NAME=VALUE, ...
支持的选项如下:
NAME |
VALUE |
详情 |
---|---|---|
default_kms_key_name |
STRING |
指定用于加密此数据集中的表数据的默认 Cloud KMS 密钥。您可以在创建表时替换此值。 |
default_partition_expiration_days |
FLOAT64 |
指定此数据集中的表分区的默认到期时间(天)。您可以在创建表时替换此值。 |
default_table_expiration_days |
FLOAT64 |
指定此数据集中的表的默认到期时间(天)。您可以在创建表时替换此值。 |
description |
STRING |
数据集的说明。 |
friendly_name |
STRING |
数据集的描述性名称。 |
labels |
<ARRAY<STRUCT<STRING, STRING>>> |
数据集的标签数组,以键值对形式表示。 |
location |
STRING |
要在其中创建数据集的位置。如果未指定此选项,则系统会在查询运行的位置创建数据集。如果您指定了此选项,并明确设置了查询作业的位置,则这两个值必须匹配:否则查询会失败。 |
max_time_travel_hours |
SMALLINT |
处于预览版阶段。 指定数据集的时间旅行窗口的时长(以小时为单位)。 如需详细了解时间旅行窗口,请参阅配置时间旅行窗口。 |
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.datasets.get |
要更改的数据集。 |
bigquery.datasets.update |
要更改的数据集。 |
示例
以下示例设置默认的表过期时间。
ALTER SCHEMA mydataset SET OPTIONS( default_table_expiration_days=3.75 )
ALTER TABLE SET OPTIONS
语句
设置表上的选项。
语法
ALTER TABLE [IF EXISTS] table_name SET OPTIONS(table_set_options_list)
参数
IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要修改的表的名称。请参阅表路径语法。table_set_options_list
:要设置的选项列表。
详情
外部表不支持此语句。
table_set_options_list
可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。
请按以下格式指定表选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
partition_expiration_days |
|
示例: 设置分区过期时间(以天为单位)。如需了解详情,请参阅设置分区过期时间。默认情况下,分区不会过期。 此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。 只能对分区表设置此属性。 |
require_partition_filter |
|
示例: 指定此表的查询是否必须包含对分区列进行过滤的谓词过滤条件。如需了解详情,请参阅设置分区过滤条件。默认值为 此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。 只能对分区表设置此属性。 |
kms_key_name |
|
示例: 此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。 请查看有关使用 Cloud KMS 密钥保护数据的详细信息。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
设置 VALUE
会替换表的该选项的现有值(如果有)。将 VALUE
设置为 NULL
会清除表中该选项的值。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
设置表上的到期时间戳和说明
以下示例将表上的到期时间戳设置为执行 ALTER TABLE
语句后七天,还设置了说明:
ALTER TABLE mydataset.mytable SET OPTIONS ( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY), description="Table that expires seven days from now" )
对分区表设置 require partition filter 特性
以下示例会对分区表设置 timePartitioning.requirePartitionFilter
特性:
ALTER TABLE mydataset.mypartitionedtable SET OPTIONS (require_partition_filter=true)
引用此表的查询必须对分区列使用过滤条件,否则 BigQuery 会返回错误。将此选项设置为 true
有助于避免查询超过预期的数据量。
清除表上的到期时间戳
以下示例清除表上的到期时间戳,使其不会过期:
ALTER TABLE mydataset.mytable SET OPTIONS (expiration_timestamp=NULL)
ALTER TABLE ADD COLUMN
语句
向现有表架构添加一个新列或多个新列。
语法
ALTER TABLE table_name
ADD COLUMN [IF NOT EXISTS] column[, ...]
参数
table_name
:表格的名称。 请参阅表路径语法。IF EXISTS
:如果列名称已存在,则语句将不起作用。column
:要添加的列。这包括要添加的列和架构的名称。此列名称和架构使用CREATE TABLE
语句中使用的语法。
详情
您无法使用此语句创建以下列:
- 分区列。
- 聚簇列。
- 现有
RECORD
字段中的嵌套列。
不能向现有表架构添加 REQUIRED
列。但是,您可以创建嵌套的 REQUIRED
列以作为新的 RECORD
字段的一部分。
外部表不支持此语句。
在没有 IF NOT EXISTS
子句的情况下,如果表已包含使用该名称的列,则语句将返回错误。如果包含 IF NOT EXISTS
子句且列名已存在,则系统不会返回任何错误,也不会执行任何操作。
现有行对应的新列的值设置为下列值之一:
- 如果采用
NULLABLE
模式添加了新列,则为NULL
。这是默认模式。 - 如果采用
REPEATED
模式添加了新列,则为空的ARRAY
。
如需详细了解 BigQuery 中的架构修改,请参阅修改表架构。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
添加列
以下示例会将以下列添加到名为 mytable
的现有表中:
- 类型为
STRING
的列A
。 - 类型为
GEOGRAPHY
的列B
。 - 类型为
NUMERIC
且采用REPEATED
模式的列C
。 - 类型为
DATE
且具有说明的列D
。
ALTER TABLE mydataset.mytable
ADD COLUMN A STRING,
ADD COLUMN IF NOT EXISTS B GEOGRAPHY,
ADD COLUMN C ARRAY<NUMERIC>,
ADD COLUMN D DATE OPTIONS(description="my description")
如果已存在名为 A
、C
或 D
的任意列,则语句将失败。如果已存在列 B
,则由于 IF NOT
EXISTS
子句的原因,语句将会成功。
添加 RECORD
列
以下示例添加了一个名为 A
且类型为 STRUCT
的列,其中包含以下嵌套列:
- 类型为
GEOGRAPHY
的列B
。 - 类型为
INT64
且采用REPEATED
模式的列C
。 - 类型为
INT64
且采用REQUIRED
模式的列D
。 - 类型为
TIMESTAMP
且具有说明的列E
。
ALTER TABLE mydataset.mytable
ADD COLUMN A STRUCT<
B GEOGRAPHY,
C ARRAY<INT64>,
D INT64 NOT NULL,
E TIMESTAMP OPTIONS(description="creation time")
>
如果表已有名为 A
的列,则即使该列不包含任何指定的嵌套列,查询也会失败。
名为 A
的新 STRUCT
可为 null,但 A
的任何 STRUCT
值都需要 A
中的嵌套列 D
。
向列添加排序规则支持
为表创建新列时,可以为该列明确分配新的排序规则规范。
ALTER TABLE mydataset.mytable ADD COLUMN word STRING COLLATE 'und:ci'
ALTER TABLE RENAME TO
语句
重命名克隆、快照或表。
语法
ALTER TABLE [IF EXISTS] table_name RENAME TO new_table_name
参数
IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要重命名的表的名称。请参阅表路径语法。new_table_name
:表的新名称。新名称不能是现有的表名称。
详情
- 外部表不支持此语句。
- 如果在重命名表时更改表政策或行级访问权限政策,则这些更改可能无效。
- 如果您想重命名包含流式插入到其中的数据的表,则必须停止流式插入,然后等待 BigQuery 指示当前未使用流式插入。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
重命名表
以下示例将表 mydataset.mytable
重命名为 mydataset.mynewtable
:
ALTER TABLE mydataset.mytable RENAME TO mynewtable
ALTER TABLE DROP COLUMN
语句
从现有表架构中丢弃一列或多列。
语法
ALTER TABLE table_name
DROP COLUMN [IF EXISTS] column_name [, ...]
参数
table_name
:要修改的表的名称。请参阅表路径语法。该表必须已存在且具有架构。IF EXISTS
:如果指定的列不存在,则语句无效。column_name
:要丢弃的列的名称。
详情
该语句不会立即释放与丢弃的列关联的存储空间。存储空间必须在丢弃列之日起的 7 天内在后台收回。
如需了解如何立即回收存储空间,请参阅从表架构中删除列。
您无法使用此语句来删除以下列:
- 分区列
- 聚簇列
- 现有
RECORD
字段中的嵌套列。
外部表不支持此语句。
在没有 IF EXISTS
子句的情况下,如果表不包含具有该名称的列,则语句将返回错误。如果包含 IF EXISTS
子句,但列名称不存在,则不会返回任何错误,也不会执行任何操作。
此语句仅从表中移除列。引用该列的任何对象(例如视图或具体化视图)都必须单独更新或重新创建。
如需详细了解 BigQuery 中的架构修改,请参阅修改表架构。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
删除列
以下示例会从名为 mytable
的现有表中删除以下列:
- “
A
”列 - “
B
”列
ALTER TABLE mydataset.mytable
DROP COLUMN A,
DROP COLUMN IF EXISTS B
如果名为 A
的列不存在,则语句将会失败。如果列 B
不存在,则由于 IF EXISTS
子句,该语句仍会成功。
ALTER TABLE SET DEFAULT COLLATE
语句
为表设置排序规则。
语法
ALTER TABLE table_name SET DEFAULT COLLATE collate_specification
参数
table_name
:要修改的表的名称。请参阅表路径语法。该表必须已存在且具有架构。SET DEFAULT COLLATE collate_specification
:在架构中创建新列时,如果列没有显式排序规则规范,则列将继承STRING
类型的这个排序规范。更新后的排序规则规范仅适用于之后添加的列。如果要更新现有排序规则规范,您必须更改包含该规范的列。如果要对现有表中的新列添加排序规则规范,可以在添加列时执行此操作。如果您直接在列上添加排序规范,则该列的排序规范优先于表的默认排序规则规范。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
假设您在名为 mydataset
的架构中有一个现有表 mytable
。
CREATE TABLE mydataset.mytable ( number INT64, word STRING ) DEFAULT COLLATE 'und:ci'
创建 mytable
时,所有 STRING
列都会继承 COLLATE 'und:ci'
。生成的表具有以下结构:
+--------------------------------+
| mydataset.mytable |
| number INT64 |
| word STRING COLLATE 'und:ci' |
+--------------------------------+
稍后,您决定更改表的排序规则规范。
ALTER TABLE mydataset.mytable SET DEFAULT COLLATE ''
虽然您更新了排序规则规范,但现有列 word
会继续使用之前的排序规则规范。
+--------------------------------+
| mydataset.mytable |
| number INT64 |
| word STRING COLLATE 'und:ci' |
+--------------------------------+
不过,如果为表创建新列,则新列包含新的排序规则规范。在以下示例中,添加了一个名为 name
的列。由于新排序规则规范为空,因此使用默认排序规则规范。
ALTER TABLE mydataset.mytable ADD COLUMN name STRING
+--------------------------------+
| mydataset.mytable |
| number INT64 |
| word STRING COLLATE 'und:ci' |
| name STRING COLLATE |
+--------------------------------+
ALTER COLUMN SET OPTIONS
语句
在 BigQuery 表中设置列选项,例如列说明。
语法
ALTER TABLE [IF EXISTS] table_name ALTER COLUMN [IF EXISTS] column_name SET OPTIONS(column_set_options_list)
参数
(ALTER TABLE) IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要修改的表的名称。请参阅表路径语法。(ALTER COLUMN) IF EXISTS
:如果指定的列不存在,则语句无效。column_name
:您要更改的顶级列的名称。不支持修改子字段,例如STRUCT
中的嵌套列。column_set_options_list
:要在列上设置的选项列表。
详情
外部表不支持此语句。
column_set_options_list
请按以下格式指定列选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
description |
|
示例: |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
设置 VALUE
会替换列的该选项的现有值(如果有)。将 VALUE
设置为 NULL
会清除列中该选项的值。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
以下示例在名为 price
的列上设置新说明:
ALTER TABLE mydataset.mytable ALTER COLUMN price SET OPTIONS ( description="Price per unit" )
ALTER COLUMN DROP NOT NULL
语句
从 BigQuery 表的列中移除 NOT NULL
限制条件。
语法
ALTER TABLE [IF EXISTS] table_name ALTER COLUMN [IF EXISTS] column DROP NOT NULL
参数
(ALTER TABLE) IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要修改的表的名称。请参阅表路径语法。(ALTER COLUMN) IF EXISTS
:如果指定的列不存在,则语句无效。column_name
:您要更改的顶级列的名称。无法修改子字段。
详情
如果列没有 NOT NULL
限制条件,则查询会返回错误。
外部表不支持此语句。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
以下示例从名为 mycolumn
的列中移除了 NOT NULL
限制条件:
ALTER TABLE mydataset.mytable ALTER COLUMN mycolumn DROP NOT NULL
ALTER COLUMN SET DATA TYPE
语句
将 BigQuery 表中某个列的数据类型更改为限制较少的数据类型。例如,NUMERIC
数据类型可以更改为 BIGNUMERIC
类型,反之不行。
语法
ALTER TABLE [IF EXISTS] table_name ALTER COLUMN [IF EXISTS] column_name SET DATA TYPE column_schema
参数
(ALTER TABLE) IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要修改的表的名称。请参阅表路径语法。(ALTER COLUMN) IF EXISTS
:如果指定的列不存在,则语句无效。column_name
:您要更改的顶级列的名称。无法修改子字段。column_schema
:您要将列转换为的架构。此架构使用与CREATE TABLE
语句相同的语法。
详情
对于有效数据类型强制转换表,请比较标准 SQL 中的转换规则页面中的“从类型”列和“强制转换为”列。
以下是有效数据类型强制转换的示例:
- INT64 到 NUMERIC、BIGNUMERIC、FLOAT64
- NUMERIC 到 BIGNUMERIC、FLOAT64
外部表不支持此语句。
在没有 IF EXISTS 子句的情况下,如果表不包含具有该名称的列,该语句将返回错误。如果包含 IF EXISTS 子句但列名不存在,则系统不会返回任何错误,也不会执行任何操作。
您还可以将数据类型从限制性更高的数据强制转换为限制性较低的参数化数据类型。例如,您可以增加字符串类型的长度上限或者增加数字类型的精度或范围。
以下是有效的参数化数据类型更改的示例:
- NUMERIC(6,10) 到 NUMERIC(8,12)
- NUMERIC 到 BIGNUMERIC(40, 20)
- STRING(5) 到 STRING(7)
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的表。 |
bigquery.tables.update |
要更改的表。 |
示例
更改列的数据类型
以下示例将列 c1
的数据类型从 INT64
更改为 NUMERIC
:
CREATE TABLE dataset.table(c1 INT64); ALTER TABLE dataset.table ALTER COLUMN c1 SET DATA TYPE NUMERIC;
更改字段的数据类型
以下示例可更改 s1
列中某个字段的数据类型:
CREATE TABLE dataset.table(s1 STRUCT<a INT64, b STRING>); ALTER TABLE dataset.table ALTER COLUMN s1 SET DATA TYPE STRUCT<a NUMERIC, b STRING>;
更改精度
以下示例更改了参数化数据类型列的精度:
CREATE TABLE dataset.table (pt NUMERIC(7,2)); ALTER TABLE dataset.table ALTER COLUMN pt SET DATA TYPE NUMERIC(8,2);
更改排序规则支持
如果您希望更新表 mytable
中的 word
列的排序规则规范,则必须直接更改该列。
ALTER TABLE mydataset.mytable ALTER COLUMN word SET DATA TYPE STRING COLLATE 'und:ci';
ALTER VIEW SET OPTIONS
语句
设置视图上的选项。
语法
ALTER VIEW [IF EXISTS] view_name SET OPTIONS(view_set_options_list)
参数
IF EXISTS
:如果不存在使用该名称的视图,则语句无效。view_name
:要修改的视图的名称。请参阅表路径语法。view_set_options_list
:要设置的选项列表。
view_set_options_list
通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。
请按以下格式指定视图选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
VALUE
是一个只包含文字、查询参数和标量函数的常数表达式。
常量表达式不得包含以下内容:
- 对表的引用
- 子查询和 SQL 语句,如
SELECT
、CREATE
和UPDATE
- 用户定义的函数、聚合函数或分析函数
- 以下标量函数:
ARRAY_TO_STRING
REPLACE
REGEXP_REPLACE
RAND
FORMAT
LPAD
RPAD
REPEAT
SESSION_USER
GENERATE_ARRAY
GENERATE_DATE_ARRAY
设置 VALUE
会替换视图上该选项的现有值(如果有)。将 VALUE
设置为 NULL
会清除视图上该选项的值。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的视图。 |
bigquery.tables.update |
要更改的视图。 |
示例
设置视图上的到期时间戳和说明
以下示例将视图上的到期时间戳设置为执行 ALTER VIEW
语句后七天,还设置了说明:
ALTER VIEW mydataset.myview SET OPTIONS ( expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY), description="View that expires seven days from now" )
ALTER MATERIALIZED VIEW SET OPTIONS
语句
设置具体化视图上的选项。
语法
ALTER MATERIALIZED VIEW [IF EXISTS] materialized_view_name SET OPTIONS(materialized_view_set_options_list)
参数
IF EXISTS
:如果不存在使用该名称的具体化视图,则语句无效。materialized_view_name
:要修改的具体化视图的名称。请参阅表路径语法。materialized_view_set_options_list
:要设置的选项列表。
materialized_view_set_options_list
通过选项列表,您可以设置具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。您可以使用逗号分隔列表添加多个选项。
请按以下格式指定具体化视图选项列表:
NAME=VALUE, ...
NAME
和 VALUE
必须是下述组合之一:
NAME |
VALUE |
详细信息 |
---|---|---|
enable_refresh |
BOOLEAN |
示例: |
refresh_interval_minutes |
FLOAT64 |
示例: |
expiration_timestamp |
TIMESTAMP |
示例: 此属性等效于 expirationTime 表资源属性。 |
friendly_name |
|
示例: 此属性等效于 friendlyName 表资源属性。 |
description |
|
示例: 此属性等效于 description 表资源属性。 |
labels |
|
示例: 此属性等效于 labels 表资源属性。 |
设置 VALUE
会针对具体化视图替换该选项的现有值(如果有)。将 VALUE
设置为 NULL
会针对具体化视图清除该选项的值。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.get |
要更改的具体化视图。 |
bigquery.tables.update |
要更改的具体化视图。 |
示例
在具体化视图上设置启用刷新状态和刷新间隔
以下示例在具体化视图上启用了刷新功能并将刷新间隔设置为 20 分钟:
ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
enable_refresh=true,
refresh_interval_minutes=20
)
DROP SCHEMA
语句
删除数据集。
语法
DROP SCHEMA [IF EXISTS]
[project_name.]dataset_name
[ CASCADE | RESTRICT ]
参数
IF EXISTS
:如果不存在具有该名称的数据集,则语句无效。project_name
:包含数据集的项目的名称默认为运行此 DDL 语句的项目。dataset_name
:要删除的数据集的名称。CASCADE
:删除数据集及数据集中的所有资源,例如表、视图和函数。您必须拥有删除资源的权限,否则语句将返回错误。如需查看 BigQuery 权限的列表,请参阅预定义角色和权限。RESTRICT
:仅当数据集为空时才能删除。否则会返回错误。如果您未指定CASCADE
或RESTRICT
,则默认行为是RESTRICT
。
详情
如果数据集存在,则除非您在查询设置中指定了位置,否则语句会在数据集的位置运行。如需了解详情,请参阅指定位置。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.datasets.delete |
要删除的数据集。 |
bigquery.tables.delete
|
要删除的数据集。如果数据集为空,则不需要此权限。 |
示例
以下示例会删除名为 mydataset
的数据集。如果该数据集不存在或不为空,则语句会返回错误。
DROP SCHEMA mydataset
以下示例会删除名为 mydataset
的数据集以及该数据集中的任何资源。如果该数据集不存在,则不会返回任何错误。
DROP SCHEMA IF EXISTS mydataset CASCADE
DROP TABLE
语句
删除表或表克隆。
语法
DROP TABLE [IF EXISTS] table_name
参数
IF EXISTS
:如果不存在使用该名称的表,则语句无效。table_name
:要删除的表的名称。请参阅表路径语法。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.delete |
要删除的表。 |
bigquery.tables.get |
要删除的表。 |
示例
删除表
以下示例演示了如何删除 mydataset
中名为 mytable
的表:
DROP TABLE mydataset.mytable
如果数据集内不存在表名称,会返回以下错误:
Error: Not found: Table myproject:mydataset.mytable
仅当某个表存在时才删除该表
仅当某个表存在时,以下示例才会删除 mydataset
中名为 mytable
的表。如果数据集内不存在该表名称,则不会返回任何错误,也不会执行任何操作。
DROP TABLE IF EXISTS mydataset.mytable
DROP SNAPSHOT TABLE
语句
删除表快照。
语法
DROP SNAPSHOT TABLE [IF EXISTS] table_snapshot_name
参数
IF EXISTS
:如果不存在使用该名称的表快照,则语句无效。table_snapshot_name
:要删除的表快照的名称。请参阅表路径语法。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.deleteSnapshot |
要删除的表快照。 |
示例
删除表快照:如果表快照不存在则失败
以下示例会删除 mydataset
数据集中名为 mytablesnapshot
的表快照:
DROP SNAPSHOT TABLE mydataset.mytablesnapshot
如果数据集内不存在表快照,会返回以下错误:
Error: Not found: Table snapshot myproject:mydataset.mytablesnapshot
删除表快照:如果表快照不存在则忽略
以下示例会删除 mydataset
数据集中名为 mytablesnapshot
的表快照。
DROP SNAPSHOT TABLE IF EXISTS mydataset.mytablesnapshot
如果数据集内不存在表快照,则不会执行任何操作,也不会返回任何错误。
如需了解如何创建表快照,请参阅 CREATE SNAPSHOT TABLE。
如需了解如何恢复表快照,请参阅 CREATE TABLE CLONE。
DROP EXTERNAL TABLE
语句
删除外部表。
语法
DROP EXTERNAL TABLE [IF EXISTS] table_name
参数
IF EXISTS
:如果不存在使用该名称的外部表,则语句无效。table_name
:要删除的外部表的名称。请参阅表路径语法。
详情
如果 table_name
存在但不是外部表,则语句会返回以下错误:
Cannot drop table_name which has type TYPE. An
external table was expected.
DROP EXTERNAL
语句只会从 BigQuery 中移除外部表定义。存储在外部位置的数据不受影响。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.delete |
要删除的外部表。 |
bigquery.tables.get |
要删除的外部表。 |
示例
以下示例会丢弃数据集 mydataset
中名为 external_table
的外部表。如果外部表不存在,则该示例会返回错误。
DROP EXTERNAL TABLE mydataset.external_table
以下示例会丢弃数据集 mydataset
中名为 external_table
的外部表。如果外部表不存在,则系统不会返回任何错误。
DROP EXTERNAL TABLE IF EXISTS mydataset.external_table
DROP VIEW
语句
删除视图。
语法
DROP VIEW [IF EXISTS] view_name
参数
IF EXISTS
:如果不存在使用该名称的视图,则语句无效。view_name
:要删除的视图的名称。请参阅表路径语法。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.delete |
要删除的视图。 |
bigquery.tables.get |
要删除的视图。 |
示例
删除视图
以下示例演示如何删除 mydataset
中名为 myview
的视图:
DROP VIEW mydataset.myview
如果数据集内不存在视图名称,会返回以下错误:
Error: Not found: Table myproject:mydataset.myview
仅当某个视图存在时才删除该视图
仅当某个视图存在时,以下示例才会删除 mydataset
中名为 myview
的视图。如果数据集内不存在该视图名称,则不会返回任何错误,也不会执行任何操作。
DROP VIEW IF EXISTS mydataset.myview
DROP MATERIALIZED VIEW
语句
删除具体化视图。
语法
DROP MATERIALIZED VIEW [IF EXISTS] mv_name
参数
IF EXISTS
:如果不存在使用该名称的具体化视图,则语句无效。mv_name
:要删除的具体化视图的名称。请参阅表路径语法。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.delete |
要删除的具体化视图。 |
bigquery.tables.get |
要删除的具体化视图。 |
示例
删除具体化视图
以下示例演示了如何删除 mydataset
中名为 my_mv
的具体化视图:
DROP MATERIALIZED VIEW mydataset.my_mv
如果数据集中不存在该具体化视图名称,会返回以下错误:
Error: Not found: Table myproject:mydataset.my_mv
如果要删除其他项目中的具体化视图,您必须按以下格式指定项目、数据集和具体化视图:`project_id.dataset.materialized_view`
(如果 project_id
包含特殊字符,则包括反引号);例如 `myproject.mydataset.my_mv`
。
仅当某个具体化视图存在时才删除该视图。
仅当某个具体化视图存在时,以下示例才会删除 mydataset
中名为 my_mv
的具体化视图。如果数据集中不存在该具体化视图名称,则不会返回任何错误,也不会执行任何操作。
DROP MATERIALIZED VIEW IF EXISTS mydataset.my_mv
如果要删除其他项目中的具体化视图,您必须按以下格式指定项目、数据集和具体化视图:`project_id.dataset.materialized_view`,
(如果 project_id
包含特殊字符,则包括反引号);例如 `myproject.mydataset.my_mv`
。
DROP FUNCTION
语句
删除用户定义的永久性函数 (UDF)。
语法
DROP FUNCTION [IF EXISTS] [[project_name.]dataset_name.]function_name
参数
IF EXISTS
:如果不存在使用该名称的函数,则语句无效。project_name
:包含要删除的函数的项目的名称。 默认为运行此 DDL 查询的项目。如果项目名称包含特殊字符(例如英文冒号),则应使用反引号`
将项目名称括起来(示例:`google.com:my_project`
)。dataset_name
:包含要删除的函数的数据集的名称。默认为请求中的defaultDataset
。function_name
:要删除的函数的名称。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.delete |
要删除的函数。 |
示例
以下示例语句会删除数据集 mydataset
中包含的函数 parseJsonAsStruct
。
DROP FUNCTION mydataset.parseJsonAsStruct;
以下示例语句会删除项目 other_project
的数据集 sample_dataset
中的函数 parseJsonAsStruct
。
DROP FUNCTION `other_project`.sample_dataset.parseJsonAsStruct;
DROP TABLE FUNCTION
删除表函数。
语法
DROP TABLE FUNCTION [IF EXISTS] [[project_name.]dataset_name.]function_name
参数
IF EXISTS
:如果不存在使用此名称的表函数,则语句无效。project_name
:项目的名称,该项目包含要删除的表函数。默认为运行此 DDL 查询的项目。dataset_name
:数据集的名称,该数据集包含要删除的表函数。function_name
:要删除的表函数的名称。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.delete |
要删除的表函数。 |
示例
以下示例将删除名为 my_table_function
的表函数:
DROP TABLE FUNCTION mydataset.my_table_function;
DROP PROCEDURE
语句
删除存储过程。
语法
DROP PROCEDURE [IF EXISTS] [[project_name.]dataset_name.]procedure_name
参数
IF EXISTS
:如果不存在使用该名称的过程,则语句无效。project_name
:包含要删除的过程的项目的名称。 默认为运行此 DDL 查询的项目。如果项目名称包含特殊字符(例如英文冒号),则应使用反引号`
将项目名称括起来(示例:`google.com:my_project`
)。dataset_name
:包含要删除的过程的数据集的名称。 默认为请求中的defaultDataset
。procedure_name
:要删除的过程的名称。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.routines.delete |
要删除的过程。 |
示例
以下示例语句会删除数据集 mydataset
中包含的过程 myprocedure
。
DROP PROCEDURE mydataset.myProcedure;
以下示例语句会删除项目 other_project
的数据集 sample_dataset
中的过程 myProcedure
。
DROP PROCEDURE `other-project`.sample_dataset.myprocedure;
DROP ROW ACCESS POLICY
语句
删除行级访问权限政策。
语法
DROP [ IF EXISTS ]
row_access_policy_name ON table_name;
DROP ALL ROW ACCESS POLICIES ON table_name;
参数
IF EXISTS
:如果不存在使用该名称的行级访问权限政策,则语句无效。row_access_policy_name
:您要删除的行级访问权限政策的名称。表的每个行级访问权限政策的名称都必须是唯一的。table_name
:包含您要删除的行级访问权限政策的表的名称。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.rowAccessPolicies.delete |
要删除的行级访问权限政策。 |
示例
从表中删除一个行级访问权限政策
DROP ROW ACCESS POLICY My_row_filter ON project.dataset.My_table;
从表中删除所有行级访问权限政策
DROP ALL ROW ACCESS POLICIES ON project.dataset.My_table;
DROP CAPACITY
语句
删除容量承诺。
语法
DROP CAPACITY [IF EXISTS]
project_id.location_id.capacity-commitment-id
参数
IF EXISTS
:如果不存在具有该 ID 的容量承诺,则语句无效。project_id
:创建预留的管理项目的 ID。location_id
:项目的位置。capacity-commitment-id
:容量承诺 ID。
如需查找容量承诺 ID,请查询 INFORMATION_SCHEMA.CAPACITY_COMMITMENTS_BY_PROJECT
表。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.capacityCommitments.delete
|
维持承诺所有权的管理项目。 |
示例
以下示例将删除容量承诺:
DROP RESERVATION `admin_project.region-us.1234`
DROP RESERVATION
语句
删除预留。
语法
DROP RESERVATION [IF EXISTS]
project_id.location_id.reservation_id
参数
IF EXISTS
:如果不存在具有该 ID 的预留,则语句无效。project_id
:创建预留的管理项目的 ID。location_id
:项目的位置。reservation_id
:预留 ID。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.reservations.delete
|
维持承诺所有权的管理项目。 |
示例
以下示例将删除预留 prod
:
DROP RESERVATION `admin_project.region-us.prod`
DROP ASSIGNMENT
语句
删除预留分配。
语法
DROP ASSIGNMENT [IF EXISTS]
project_id.location_id.reservation_id.assignment_id
参数
IF EXISTS
:如果不存在具有该 ID 的分配,则语句无效。project_id
:创建预留的管理项目的 ID。location_id
:项目的位置。reservation_id
:预留 ID。assignment_id
:分配 ID。
如需查找分配 ID,请查询 INFORMATION_SCHEMA.ASSIGNMENTS_BY_PROJECT
表。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.reservationAssignments.delete
|
管理项目和分配对象。 |
示例
以下示例从名为 prod
的预留中删除分配:
DROP ASSIGNMENT `admin_project.region-us.prod.1234`
DROP SEARCH INDEX
语句
删除表上的搜索索引。
语法
DROP SEARCH INDEX [ IF EXISTS ] index_name ON table_name
参数
IF EXISTS
:如果表不存在具有该名称的搜索索引,则语句无效。index_name
:要删除的索引的名称。table_name
:具有索引的表的名称。
所需权限
此语句需要以下 IAM 权限:
权限 | 资源 |
---|---|
bigquery.tables.deleteIndex |
具有要删除的索引的表。 |
示例
以下示例会从 my_table
中删除索引 my_index
:
DROP SEARCH INDEX my_index ON dataset.my_table;
表路径语法
请使用以下语法指定表资源的路径,包括标准表、视图、具体化视图、外部表和表快照。
table_path :=
[[project_name.]dataset_name.]table_name
project_name
:包含表资源的项目的名称。默认为运行此 DDL 查询的项目。如果项目名称包含特殊字符(例如英文冒号),请使用英文反引号`
括住名称(例如:`google.com:my_project`
)。dataset_name
:包含表资源的数据集的名称。默认为请求中的defaultDataset
。table_name
:表资源的名称。
在 BigQuery 中创建表时,每个数据集的表名称必须是唯一的。表名称可:
- 包含最多 1024 个字符。
- 包含类别 L(字母)、M(符号)、N(数字)、Pc(连接符,包括下划线)、Pd(短划线)、Zs(空格)中的 Unicode 字符。如需了解详情,请参阅常规类别。
例如,以下都是有效的表名称:table 01
、ग्राहक
、00_お客様
、étudiant-01
。
某些表名称和表名称前缀已被预留。如果您收到错误,表示您的表名称或前缀已被预留,请选择其他名称并重试。