clickhouse创建数据库以及表
创建数据库
- 语法
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
- 例子
CREATE DATABASE IF NOT EXISTS chtest; --使用默认库引擎创建库
默认情况下,ClickHouse
使用的是原生的数据库引擎Ordinary
(在此数据库下可以使用任意类型的表引擎,在绝大多数情况下都只需使用默认的数据库引擎)。
创建表
- 语法
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
- 示例
-- 注意首字母大写
-- 建表
node1 :) use default;
node1 :) create table test(id Int32,name String) engine=Memory; --内存引擎表
node1 :) insert into test(id,name) values(110,'test'); --字符串不能使用双引号
node1 :) select * from test;
SELECT *
FROM test
┌──id─┬─name───┐
│ 110 │ test │
└─────┴────────┘
上面命令创建了一张内存表
,即使用Memory引擎
。表引擎决定了数据表的特性,也决定了数据将会被如何存储及加载。Memory引擎
是ClickHouse
最简单的表引擎,数据只会被保存在内存中,在服务重启时数据会丢失。一般应用于中间表
或者临时表
。
分布式DDL操作
默认情况下,CREATE、DROP、ALTER、RENAME
操作仅仅在当前执行该命令的server
上生效。
在集群环境下,可以使用ON CLUSTER
语句,这样就可以在整个集群发挥作用。
比如创建一张分布式表:
node1 :) CREATE TABLE IF NOT EXISTS user_cluster ON CLUSTER news_ck_cluster(
id Int32,
name String) ENGINE = Distributed(news_ck_cluster, default, user_local,id);
Distributed表引擎的定义形式如下所示:关于ClickHouse的表引擎,后续章节做详细解释。
Distributed(cluster_name, database_name, table_name[, sharding_key])
各个参数的含义分别如下:
- cluster_name:集群名称,与集群配置中的自定义名称相对应。
- database_name:数据库名称
- table_name:表名称,映射到每台服务器中的表名称。
- sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。
创建完成上面的分布式表时,在每台机器上查看表,发现每台机器上都存在一张刚刚创建好的表。
接下来就需要创建本地表了,在每台机器上分别创建一张本地表:
-- 没有自动创建可以手动创建
node1 :) CREATE TABLE IF NOT EXISTS user_local
(
id Int32,
name String
)ENGINE = MergeTree()
ORDER BY id
PARTITION BY id
PRIMARY KEY id;
我们先在一台机器上,对user_local表进行插入数据,然后再查询user_cluster表:
-- 插入数据
node1 :) INSERT INTO user_local VALUES(1,'tom'),(2,'jack');
-- 查询user_cluster表,可见通过user_cluster表可以操作所有的user_local表
node1 :) select * from user_cluster;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
接下来,我们再向user_cluster中插入一些数据,观察user_local表数据变化,可以发现数据被分散存储到了其他节点上了。
-- 向user_cluster插入数据
node1 :) INSERT INTO user_cluster VALUES(3,'lilei'),(4,'lihua');
-- 查看user_cluster数据
node1 :) select * from user_cluster;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│ 3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
┌─id─┬─name──┐
│ 4 │ lihua │
└────┴───────┘
-- 在node1上查看user_local
node1 :) select * from user_local;
┌─id─┬─name─┐
│ 2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│ 3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│ 1 │ tom │
└────┴──────┘
-- 在hadoop02上查看user_local
hadoop02 :) select * from user_local;
┌─id─┬─name──┐
│ 4 │ lihua │
└────┴───────┘
注:
1、创建分布式表是读时检查的机制,也就是说对创建分布式表和本地表的顺序并没有强制要求。
2、在上面的语句中使用了ON CLUSTER分布式DDL,这意味着在集群的每个分片节点上,都会创建一张Distributed表,这样便可以从其中任意一端发起对所有分片的读、写请求。
3、分布式表映射到每台服务器一张本地表。
上一篇: Oracle数据库表空间 数据文件 用户 以及表创建的SQL代码
下一篇: SQL创建表以及约束