create
CREATE DATABASE
该查询用于根据指定名称创建数据库。
CREATE DATABASE [IF NOT EXISTS] db_name
数据库其实只是用于存放表的一个目录。
如果查询中存在IF NOT EXISTS
,则当数据库已经存在时,该查询不会返回任何错误。
CREATE TABLE
对于CREATE TABLE
,存在以下几种方式。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
在指定的’db’数据库中创建一个名为’name’的表,如果查询中没有包含’db’,则默认使用当前选择的数据库作为’db’。后面的是包含在括号中的表结构以及表引擎的声明。 其中表结构声明是一个包含一组列描述声明的组合。如果表引擎是支持索引的,那么可以在表引擎的参数中对其进行说明。
在最简单的情况下,列描述是指名称 类型
这样的子句。例如: RegionID UInt32
。
但是也可以为列另外定义默认值表达式(见后文)。
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
创建一个与db2.name2
具有相同结构的表,同时你可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2
使用相同的表引擎。
CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
使用指定的引擎创建一个与SELECT
子句的结果具有相同结构的表,并使用SELECT
子句的结果填充它。
以上所有情况,如果指定了IF NOT EXISTS
,那么在该表已经存在的情况下,查询不会返回任何错误。在这种情况下,查询几乎不会做任何事情。
在ENGINE
子句后还可能存在一些其他的子句,更详细的信息可以参考 表引擎 中关于建表的描述。
默认值
在列描述中你可以通过以下方式之一为列指定默认表达式:DEFAULT expr
,MATERIALIZED expr
,ALIAS expr
。
示例:URLDomain String DEFAULT domain(URL)
。
如果在列描述中未定义任何默认表达式,那么系统将会根据类型设置对应的默认值,如:数值类型为零、字符串类型为空字符串、数组类型为空数组、日期类型为’1970-01-01’以及时间类型为 zero unix timestamp。
如果定义了默认表达式,则可以不定义列的类型。如果没有明确的定义类的类型,则使用默认表达式的类型。例如:EventDate DEFAULT toDate(EventTime)
- 最终’EventDate’将使用’Date’作为类型。
如果同时指定了默认表达式与列的类型,则将使用类型转换函数将默认表达式转换为指定的类型。例如:Hits UInt32 DEFAULT 0
与Hits UInt32 DEFAULT toUInt32(0)
意思相同。
默认表达式可以包含常量或表的任意其他列。当创建或更改表结构时,系统将会运行检查,确保不会包含循环依赖。对于INSERT, 它仅检查表达式是否是可以解析的 - 它们可以从中计算出所有需要的列的默认值。
DEFAULT expr
普通的默认值,如果INSERT中不包含指定的列,那么将通过表达式计算它的默认值并填充它。
MATERIALIZED expr
物化表达式,被该表达式指定的列不能包含在INSERT的列表中,因为它总是被计算出来的。
对于INSERT而言,不需要考虑这些列。
另外,在SELECT查询中如果包含星号,此列不会被用来替换星号,这是因为考虑到数据转储,在使用SELECT *
查询出的结果总能够被’INSERT’回表。
ALIAS expr
别名。这样的列不会存储在表中。 它的值不能够通过INSERT写入,同时使用SELECT查询星号时,这些列也不会被用来替换星号。 但是它们可以显示的用于SELECT中,在这种情况下,在查询分析中别名将被替换。
当使用ALTER查询对添加新的列时,不同于为所有旧数据添加这个列,对于需要在旧数据中查询新列,只会在查询时动态计算这个新列的值。但是如果新列的默认表示中依赖其他列的值进行计算,那么同样会加载这些依赖的列的数据。
如果你向表中添加一个新列,并在之后的一段时间后修改它的默认表达式,则旧数据中的值将会被改变。请注意,在运行后台合并时,缺少的列的值将被计算后写入到合并后的数据部分中。
不能够为nested类型的列设置默认值。
制约因素
随着列描述约束可以定义:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
...
CONSTRAINT constraint_name_1 CHECK boolean_expr_1,
...
) ENGINE = engine
boolean_expr_1
可以通过任何布尔表达式。 如果为表定义了约束,则将为表中的每一行检查它们中的每一行 INSERT
query. If any constraint is not satisfied — server will raise an exception with constraint name and checking expression.
添加大量的约束会对big的性能产生负面影响 INSERT
查询。
Ttl表达式
定义值的存储时间。 只能为MergeTree系列表指定。 有关详 细说明,请参阅 列和表的TTL.
列压缩编解ecs
默认情况下,ClickHouse应用以下定义的压缩方法 服务器设置,列。 您还可以定义在每个单独的列的压缩方法 CREATE TABLE
查询。
CREATE TABLE codec_example
(
dt Date CODEC(ZSTD),
ts DateTime CODEC(LZ4HC),
float_value Float32 CODEC(NONE),
double_value Float64 CODEC(LZ4HC(9))
value Float32 CODEC(Delta, ZSTD)
)
ENGINE = <Engine>
...
!!! warning "警告"
您无法使用外部实用程序解压缩ClickHouse数据库文件,如 lz4
. 相反,使用特殊的 ツ环板compressorョツ嘉ッツ偲 实用程序。
下表引擎支持压缩: