表管理

在开始使用表管理功能前,推荐您先了解以下相关预备知识,以便更好地理解和应用表管理功能:

  • 时序数据模型:了解时序数据的基本概念与特点,帮助建立建模基础。
  • 建模方案设计:掌握 IoTDB 时序模型及适用场景,为表管理提供设计基础。

1. 表管理

1.1 创建表

1.1.1 通过 Create 语句手动创建表

用于在当前数据库中创建表,也可以对任何指定数据库创建表,格式为“数据库名.表名”。

语法:

createTableStatement
    : CREATE TABLE (IF NOT EXISTS)? qualifiedName
        '(' (columnDefinition (',' columnDefinition)*)? ')'
        charsetDesc?
        comment?
        (WITH properties)?
     ;

charsetDesc
    : DEFAULT? (CHAR SET | CHARSET | CHARACTER SET) EQ? identifierOrString
    ;

columnDefinition
    : identifier columnCategory=(TAG | ATTRIBUTE | TIME) charsetName? comment?
    | identifier type (columnCategory=(TAG | ATTRIBUTE | TIME | FIELD))? charsetName? comment?
    ;

charsetName
    : CHAR SET identifier
    | CHARSET identifier
    | CHARACTER SET identifier
    ;

comment
    : COMMENT string
    ;

说明:

  1. 在创建表时,可以不指定时间列(TIME),IoTDB会自动添加该列并命名为“time”, 且顺序上位于第一列。其他所有列可以通过在数据库配置时启用enable_auto_create_schema选项,或通过 session 接口自动创建或修改表的语句来添加。
  2. 自 V2.0.8 版本起,支持创建表时自定义命名时间列,自定义时间列在表中的顺序由创建 SQL 中的顺序决定。相关约束如下:
  • 当列分类(columnCategory)设为 TIME 时,数据类型(dataType)必须为 TIMESTAMP。
  • 每张表最多允许定义 1个时间列(columnCategory = TIME)。
  • 当未显式定义时间列时,不允许其他列使用 time 作为名称,否则会与系统默认时间列命名冲突。
  1. 列的类别可以省略,默认为FIELD。当列的类别为TAGATTRIBUTE时,数据类型需为STRING(可省略)。
  2. 表的TTL默认为其所在数据库的TTL。如果使用默认值,可以省略此属性,或将其设置为default
  3. <TABLE_NAME>表名称,具有以下特性:
    • 大小写不敏感,创建成功后,统一显示为小写

    • 名称可包含特殊字符,如 ~!"%` 等

    • 包含特殊字符或中文字符的表名创建时必须用双引号 "" 括起来。

      • 注意:SQL中特殊字符或中文表名需加双引号。原生API中无需额外添加,否则表名会包含引号字符。
    • 当为表命名时,最外层的双引号("")不会在实际创建的表名中出现。

    •  -- SQL 
       "a""b" --> a"b
       """""" --> ""
       -- API 中
       "a""b" --> "a""b"
      
  4. columnDefinition 列名称与表名称具有相同特性,并且可包含特殊字符.
  5. COMMENT 给表添加注释。

示例:

CREATE TABLE table1 (
  time TIMESTAMP TIME,
  region STRING TAG,
  plant_id STRING TAG,
  device_id STRING TAG,
  model_id STRING ATTRIBUTE,
  maintenance STRING ATTRIBUTE COMMENT 'maintenance',
  temperature FLOAT FIELD COMMENT 'temperature',
  humidity FLOAT FIELD COMMENT 'humidity',
  status Boolean FIELD COMMENT 'status',
  arrival_time TIMESTAMP FIELD COMMENT 'arrival_time'
) COMMENT 'table1' WITH (TTL=31536000000);

CREATE TABLE if not exists tableB ();

CREATE TABLE tableC (
  station STRING TAG,
  temperature int32 FIELD COMMENT 'temperature'
 ) with (TTL=DEFAULT);
 
  -- 自定义时间列:命名为time_test, 位于表的第二列
 CREATE TABLE table1 (
     region STRING TAG, 
     time_user_defined TIMESTAMP TIME, 
     temperature FLOAT FIELD
 );

注意:若您使用的终端不支持多行粘贴(例如 Windows CMD),请将 SQL 语句调整为单行格式后再执行。

1.2 查看表

用于查看该数据库中或指定数据库中的所有表和表库的属性信息。

语法:

SHOW TABLES (DETAILS)? ((FROM | IN) database_name)?

说明:

  1. 在查询中指定了FROMIN子句时,系统将展示指定数据库内的所有表。
  2. 如果未指定FROMIN子句,系统将展示当前选定数据库中的所有表。如果用户未使用(use)某个数据库空间,系统将报错。
  3. 请求显示详细信息(指定DETAILS),系统将展示表的当前状态,包括:
    • USING:表示表处于正常可用状态。
    • PRE_CREATE:表示表正在创建中或创建失败,此时表不可用。
    • PRE_DELETE:表示表正在删除中或删除失败,此类表将永久不可用。

示例:

show tables from database1;
+---------+---------------+
|TableName|        TTL(ms)|
+---------+---------------+
|   table1|    31536000000|
+---------+---------------+
show tables details from database1;
+---------------+-----------+------+-------+
|      TableName|    TTL(ms)|Status|Comment|
+---------------+-----------+------+-------+
|         table1|31536000000| USING| table1|
+---------------+-----------+------+-------+

1.3 查看表的列

用于查看表的列名、数据类型、类别、状态。

语法:

(DESC | DESCRIBE) <TABLE_NAME> (DETAILS)?

说明:

  • 如果设置了DETAILS选项,系统将展示列的详细状态信息,包括:
    • USING:表示列目前处于正常使用状态。
    • PRE_DELETE:表示列正在被删除或删除操作失败,该列将永久无法使用。

示例:

desc table1;
+------------+---------+---------+
|  ColumnName| DataType| Category|
+------------+---------+---------+
|        time|TIMESTAMP|     TIME|
|      region|   STRING|      TAG|
|    plant_id|   STRING|      TAG|
|   device_id|   STRING|      TAG|
|    model_id|   STRING|ATTRIBUTE|
| maintenance|   STRING|ATTRIBUTE|
| temperature|    FLOAT|    FIELD|
|    humidity|    FLOAT|    FIELD|
|      status|  BOOLEAN|    FIELD|
|arrival_time|TIMESTAMP|    FIELD|
+------------+---------+---------+
desc table1 details;
+------------+---------+---------+------+------------+
|  ColumnName| DataType| Category|Status|     Comment|
+------------+---------+---------+------+------------+
|        time|TIMESTAMP|     TIME| USING|        null|
|      region|   STRING|      TAG| USING|        null|
|    plant_id|   STRING|      TAG| USING|        null|
|   device_id|   STRING|      TAG| USING|        null|
|    model_id|   STRING|ATTRIBUTE| USING|        null|
| maintenance|   STRING|ATTRIBUTE| USING| maintenance|
| temperature|    FLOAT|    FIELD| USING| temperature|
|    humidity|    FLOAT|    FIELD| USING|    humidity|
|      status|  BOOLEAN|    FIELD| USING|      status|
|arrival_time|TIMESTAMP|    FIELD| USING|arrival_time|
+------------+---------+---------+------+------------+

1.4 查看表的创建信息

用于获取表模型下表或视图的完整定义语句。该功能会自动补全创建时省略的所有默认值,因此结果集中所展示的语句可能与原始创建语句不同。

V2.0.5 起支持该功能

语法:

SHOW CREATE TABLE <TABLE_NAME>

说明:

  1. 该语句不支持对系统表的查询

示例:

show create table table1;
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table|                                                                                                                                                                                                                                                                     Create Table|
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|table1|CREATE TABLE "table1" ("region" STRING TAG,"plant_id" STRING TAG,"device_id" STRING TAG,"model_id" STRING ATTRIBUTE,"maintenance" STRING ATTRIBUTE,"temperature" FLOAT FIELD,"humidity" FLOAT FIELD,"status" BOOLEAN FIELD,"arrival_time" TIMESTAMP FIELD) WITH (ttl=31536000000)|
+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Total line number = 1

1.5 修改表

用于修改表,包括添加列、删除列以及设置表的属性。

语法:

#addColumn;
ALTER TABLE (IF EXISTS)? tableName=qualifiedName ADD COLUMN (IF NOT EXISTS)? column=columnDefinition COMMENT 'column_comment';
#dropColumn;
ALTER TABLE (IF EXISTS)? tableName=qualifiedName DROP COLUMN (IF EXISTS)? column=identifier; 
#setTableProperties;                  
// set TTL can use this;
ALTER TABLE (IF EXISTS)? tableName=qualifiedName SET PROPERTIES propertyAssignments;  
              
COMMENT ON TABLE tableName=qualifiedName IS 'table_comment';
COMMENT ON COLUMN tableName.column IS 'column_comment';

说明:

  1. SET PROPERTIES操作目前仅支持对表的 TTL 属性进行配置。
  2. 删除列功能,仅支持删除属性列(ATTRIBUTE)和物理量列(FIELD),标识列(TAG)不支持删除。
  3. 修改后的 comment 会覆盖原有注释,如果指定为 null,则会擦除之前的 comment。

示例:

ALTER TABLE table1 ADD COLUMN IF NOT EXISTS a TAG COMMENT 'a';
ALTER TABLE table1 ADD COLUMN IF NOT EXISTS b FLOAT FIELD COMMENT 'b';
ALTER TABLE table1 set properties TTL=3600;
COMMENT ON TABLE table1 IS 'table1';
COMMENT ON COLUMN table1.a IS null;

1.6 删除表

用于删除表。

语法:

DROP TABLE (IF EXISTS)? <TABLE_NAME>;

示例:

DROP TABLE table1;
DROP TABLE database1.table1;