参考资料
https://clickhouse.tech/docs/en/sql-reference/statements/create/
版本:v20.11
目录
总览
create查询将创建以下类型之一:
CREATE DATABASE
创建一个新数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
子句
IF NOT EXISTS
如果数据库名字db_name已经存在,那么clickhouse不会创建一个新数据库
- 如果指定了子句,则不会引发异常。
- 如果未指定子句,则引发异常。
ON CLUSTER
ClickHouse在指定集群的所有服务器上创建db_name数据库。 Distributed DDL 更多详细信息。
ENGINE
MySQL引擎允许您从远程MySQL服务器检索数据。
默认情况下,ClickHouse使用自己的数据库引擎(Ordinary)。
另外还有Lazy引擎、Memory引擎、Dictionary引擎。
CREATE TABLE
创建一个新表。 根据使用情况,此查询可以具有各种语法形式。
默认情况下,仅在当前服务器上创建表。Distributed DDL (分布式DDL)通过ON CLUSTER创建,该子句将单独描述。
语法形式
使用显示语法结构
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
...
) ENGINE = engine
如果db没有指定,则在当前数据库进行创建,如果指定db,则在db数据库进行创建,使用括号中的语句创建,并使用指定的engine引擎。
表的结构是 [列说明、二级索引和约束] 的列表。
如果引擎支持主键,那么主键将作为表引擎的参数。
在最简单情况下,列描述是名称+类型。例如:RegionID UInt32
也可以为默认值定义表达式。(参见下文)
使用其他表的结构
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
创建一张与另一个表具有相同结构的表。
可以为新表指定其他引擎。 如果未指定引擎,则将使用与旧表相同的引擎。
使用表函数返回的结构
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS table_function()
CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
用表函数返回的结构和数据创建一个表。
使用select查询返回的表结构创建表,可以指定engine,并使用select查询返回的值作为内容插入表中。
在所有情况下,如果指定了IF NOT EXISTS,那么如果表已经存在,查询将不会返回错误。 在这种情况下,查询将不会执行任何操作。
查询中的ENGINE子句之后可以有其他子句。参阅表引擎描述table engines.
默认值
列描述可以通过以下方式指定默认值的表达式:
- DEFAULT expr
- MATERIALIZED expr
- ALIAS expr
举例:URLDomain String DEFAULT domain(URL)
.
如果没有指定默认值表达式,那么对于不同的数据类型:
- 数字(numbers):0
- 字符串(strings):空字符串
- 数组(arrays):空数组
- 日期(date):
1970-01-01
- 时间戳(DateTime):zero unix timestamp
- 空值(Nullable):NULL
如果定义了默认表达式,则列类型是可选的。 如果没有明确定义的类型,则使用默认的表达式类型。
示例:EventDate DEFAULT toDate(EventTime),‘Date’ 类型将用于‘EventDate’ 列
如果显式定义了数据类型和默认表达式,则将使用类型转换函数将此表达式转换为指定的类型。
示例:Hits UInt32 DEFAULT 0 和 Hits UInt32 DEFAULT toUInt32(0)含义相同
可以将默认表达式定义为表常量和列中的任意表达式。 创建和更改表格结构时,它会检查表达式是否不包含循环。 对于INSERT,它将检查表达式是否可解析。
DEFAULT子句
默认值。 如果INSERT查询未指定相应的列,则将通过计