超级表的这个概念在TDengine应该算是很重要,很实用的一个东西了。就是学习的时候有的时候有点不知所云。而且查询资料的时候比价少。可参考的东西他哎多了,学习过程,对小白有一丢丢阻碍。
不过好在大部分语法还是使用的sql,使用过程中只需要学习TDengine的特色即可。比如超级表,但是超级表还是要结合TAG来用比较好。。。
用于记录学习经过,碰到的问题。
目前碰到需求,需要实现对某几张表的某几个字段进行查询。使用如果使用超级表,默认是直接查询所有的子表数据,显然不符合需求。后来知道了,需要用到TDengine的TAG。
说明:
TAGS列总长度不能超过512 bytes;
TAGS列的数据类型不能是timestamp和nchar类型;
TAGS列名不能与其他列名相同;
TAGS列名不能为预留关键字。
1、为超级表新建一个TAG,我的需求是用TAG指定表名。
这是为超级表建TAG的语句
ALTER TABLE <stable_name> ADD TAG <new_tag_name> <TYPE>
在这里吐槽一下(当然也可能是自己理解能力问题)上面语句我理解是这样写的:
ALTER TABLE s_01020110 add tag tables_name binary;
回车之后:
DB error: invalid SQL: invalid binary/nchar tag length
一眼看去,是没有指定长度的意思,于是指定长度:
ALTER TABLE s_01020110 add tag tables_name BINARY 40;
回车之后:
DB error: syntax error near "40;"
查看文档,也没有具体的demo,网上各种查,也没查到别人写的demo,最后尝试了另外一种写法:
ALTER TABLE s_01020110 add tag tables_name BINARY(40);
这个时候回车发现成功了。。。。
这个时候查看超级表的描述;
describe s_01020110;
看到已经创建好了
2、删除超级表的TAG
ALTER TABLE <stable_name> DROP TAG <tag_name>
这个没有遇到问题;
3、为超级表下的子表创建TAG;
上面第一步创建好了TAG字段名字,看一下这个TAG的内容;
select tables_name from s_01020110;
发现都是null,下面开始
修改子表标签值,官方文档是:
ALTER TABLE tb_name SET TAG tag_name=new_tag_value;
我的需求是,利用TAG区分要查询的表,所以我就把TAG设置成子表的表名字;
ALTER TABLE t_0102011001 SET TAG tables_name='t_0102011001';
我的超级表下有4张子表,所以针对每张子表进行设置(此阶段处于开发sql模板阶段,所以我是测试使用)。
如果以后上生产了,可能一个超级表下很多子表,不可能每张表单独再设置一遍。所以在创建超级表的时候就要定好规范参考如下:
定义STable表结构并使用它创建子表
创建STable语句如下:
CREATE TABLE thermometer (ts timestamp, degree double)
TAGS(location binary(20), type int)
这里定义了一个超级表,表名为:thermometer,字段是:(s timestamp, degree double)TAGS(location,type)分别为binary(20)和int 类型;
这样定义了超级表之后,以后创建子表的时候就要按照规定创建好指定TAGS如下:
假设有北京,天津和上海三个地区的采集器共4个,温度采集器有3种类型,我们就可以对每个采集器建表如下:
CREATE TABLE therm1 USING thermometer TAGS (’beijing’, 1);
CREATE TABLE therm2 USING thermometer TAGS (’beijing’, 2);
CREATE TABLE therm3 USING thermometer TAGS (’tianjin’, 1);
CREATE TABLE therm4 USING thermometer TAGS (’shanghai’, 3);
TAG如果创建好了之后,我来查询超级表下每个表里面有多少条记录;
select count(*) from s_01020110 group by tables_name;
暂时记录到这里。。。