表管理

当前版本:v1.4, 更新时间:2019-10-18

1. 查看表信息

    在松果时序数据库中,可以通过查询系统表 sys_table 及 sys_column 获取系统表和数据表的表结构。

2. 创建数据表

    使用 CREATE TABALE 语句创建表。每个表必须有两个固定的列:设备ID(devid)列,数据类型为bigint,以及时间戳(tstamp)列,数据类型为datetime;表的主键为设备ID和时间戳,创建表时不需要显示指定主键,也不能修改他们的类型和顺序,一个典型的创建表语句示例如下:

CREATE TABLE tabname
(
  devid bigint,
  tstamp datetime,
  ...
)

例如:创建一个表tab01的示例:

CREATE TABLE tab01
(
  devid bigint,
  tstamp datetime,
  val01 bool,
  val02 bigint,
  val03 datetime,
  val04 double,
  val05 real2,
  val06 real3,
  val07 real4,
  val08 real6,
  val09 string,
  val10 blob
)

3. 修改表结构

    使用 ALTER TABLE 语句修改表结构,设备ID(devid)和时间戳(tstamp)列不可修改。一个典型的修改表结构语句如下所示:

ALTER TABLE tabname
(
  devid bigint,  
  tstamp datetime,
  ...
)

一个修改表tab01的示例:

ALTER TABLE tab01
(    
  devid bigint,    
  tstamp datetime,    
  val01 bool,    
  val02 bigint,    
  val03 datetime,    
  val04 double,    
  val05 string,    
  val06 blob
)

概念说明:
字段标识 : 使用列名(不区分大小写)和类型的组合标识一个字段。
删除字段 : 若一个字段标识在原表结构中存在,新表结构中不存在,则表示该字段被删除。
新增字段 : 若一个字段标识在原表结构中不存在,新表结构中存在,则表示该字段是新增字段。需要说名的是当修改一个字段从val01 bool 到 val01 bigint 后表示删除了字段val01 bool , 新增了字段 val01 bigint。 修改表结构 : 若修改了任何字段之间的顺序、字段名、字段类型,都将视为修改了表结构。

修改表结构后有如下影响:
当系统执行插入数据时

  • 当对应的数据文件存在时,会检查当前表结构与数据文件中的表结构是否一致(字段名、类型、顺序完全一致),若不一致则插入失败。

  • 当对应的数据文件不存在时,会使用当前表结构创建数据文件,然后将数据插入到新建的数据文件中。

当系统执行查询数据时
删除的字段无法查询到(数据依然存在),新添加的字段在已存在的数据文件上查询时的值为null。

修改表结构的实例:

--1. 创建表
CREATE TABLE test
(
  devid bigint,
  tstamp datetime,  
  val01 bool,  
  val02 bigint,  
  val03 double,  
  val04 real2
)

--2. 创建设备
INSERT INTO sys_dev(tabname, devid)
VALUES('test',1)

--3. 添加数据
INSERT INTO test(devid,tstamp,val01,val02,val03)
VALUES(1, now(), true, 1, 1.1111)

--4. 查询数据
SELECT * FROM test

-- devid | tstamp              | val01| val02 | val03  | val04
--     1 | 2019-10-14 13:29:37 | true |     1 | 1.1111 | 0
--从查询结果可知,若插入数据时未指定值,则会以该字段类型默认值填充

--5. 修改表结构
ALTER TABLE test
(
  devid bigint,  
  tstamp datetime,  
  val02 bigint,  
  val03 double,  
  val04 real2,  
  val05 string
)

--6. 查询数据
SELECT * FROM test

-- devid | tstamp              | val02| val03  | val04 | val05
--     1 | 2019-10-14 13:29:37 |    1 | 1.1111 |     0 |  null
--从查询结果可知,已无法查询到列val01的数据,由于val05列是新加的列,查询结果为 null

--7. 添加数据到已存在的数据文件
INSERT INTO test(devid,tstamp,val02,val03)
VALUES(1, now(), 2, 2.222)

--执行失败,当插入到已存在的数据文件上时,数据文件与当前表结构不匹配,无法插入数据

--8. 添加数据到不存在的数据文件
INSERT INTO test(devid,tstamp,val02,val03)
VALUES(1, now(1d), 3, 3.333)

--执行成功,插入数据时使用当前表结构创建数据文件

--9. 查询数据
SELECT * FROM test
-- devid | tstamp              | val02| val03  | val04 | val05
--     1 | 2019-10-14 13:29:37 |    1 | 1.1111 |     0 | null
--     2 | 2019-10-15 13:40:10 |    3 | 3.333  |     0 |


4. 删除表

    使用 DROP TABLE 语句删除表,删除表会删除改表的设备文件和所有数据文件,请谨慎操作。

    删除表tab01的示例如下:

DROP TABLE tab01

5. 分离表

    分离表可以将数据表从系统中移除,但是保留表的设备文件和所有数据文件。分离表可以将一个表的所有数据转移到另一台服务器。具体操作需结合后面的附加表数据文件操作。

    分离表的使用方法如下:

DETACH TABLE tabname

6. 附加表

    附加表可将表添加到系统中,表的设备文件必须在系统表目录下(即:sys_config系统表中tabPath配置项下),使用方法如下:

ATTACH TABLE tabname

    注意:附加表后,表原来的数据文件不会自动附加,请根据数据文件管理部分手动附加数据文件。