表管理

1. 查看表信息

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

2. 创建数据表

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

  1. CREATE TABLE tabname
  2. (
  3. devid bigint,
  4. tstamp datetime,
  5. ...
  6. )

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

  1. CREATE TABLE tab01
  2. (
  3. devid bigint,
  4. tstamp datetime,
  5. val01 bool,
  6. val02 bigint,
  7. val03 datetime,
  8. val04 double,
  9. val05 real2,
  10. val06 real3,
  11. val07 real4,
  12. val08 real6,
  13. val09 string,
  14. val10 blob
  15. )

3. 修改表结构

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

  1. ALTER TABLE tabname
  2. (
  3. devid bigint,
  4. tstamp datetime,
  5. ...
  6. )

一个修改表tab01的示例:

  1. ALTER TABLE tab01
  2. (
  3. devid bigint,
  4. tstamp datetime,
  5. val01 bool,
  6. val02 bigint,
  7. val03 datetime,
  8. val04 double,
  9. val05 string,
  10. val06 blob
  11. )

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

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

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

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

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

修改表结构的实例:

  1. --1. 创建表
  2. CREATE TABLE test
  3. (
  4. devid bigint,
  5. tstamp datetime,
  6. val01 bool,
  7. val02 bigint,
  8. val03 double,
  9. val04 real2
  10. )
  11. --2. 创建设备
  12. INSERT INTO sys_dev(tabname, devid)
  13. VALUES('test',1)
  14. --3. 添加数据
  15. INSERT INTO test(devid,tstamp,val01,val02,val03)
  16. VALUES(1, now(), true, 1, 1.1111)
  17. --4. 查询数据
  18. SELECT * FROM test
  19. -- devid | tstamp | val01| val02 | val03 | val04
  20. -- 1 | 2019-10-14 13:29:37 | true | 1 | 1.1111 | 0
  21. --从查询结果可知,若插入数据时未指定值,则会以该字段类型默认值填充
  22. --5. 修改表结构
  23. ALTER TABLE test
  24. (
  25. devid bigint,
  26. tstamp datetime,
  27. val02 bigint,
  28. val03 double,
  29. val04 real2,
  30. val05 string
  31. )
  32. --6. 查询数据
  33. SELECT * FROM test
  34. -- devid | tstamp | val02| val03 | val04 | val05
  35. -- 1 | 2019-10-14 13:29:37 | 1 | 1.1111 | 0 | null
  36. --从查询结果可知,已无法查询到列val01的数据,由于val05列是新加的列,查询结果为 null
  37. --7. 添加数据到已存在的数据文件
  38. INSERT INTO test(devid,tstamp,val02,val03)
  39. VALUES(1, now(), 2, 2.222)
  40. --执行失败,当插入到已存在的数据文件上时,数据文件与当前表结构不匹配,无法插入数据
  41. --8. 添加数据到不存在的数据文件
  42. INSERT INTO test(devid,tstamp,val02,val03)
  43. VALUES(1, now(1d), 3, 3.333)
  44. --执行成功,插入数据时使用当前表结构创建数据文件
  45. --9. 查询数据
  46. SELECT * FROM test
  47. -- devid | tstamp | val02| val03 | val04 | val05
  48. -- 1 | 2019-10-14 13:29:37 | 1 | 1.1111 | 0 | null
  49. -- 2 | 2019-10-15 13:40:10 | 3 | 3.333 | 0 |

4. 删除表

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

删除表tab01的示例如下:

  1. DROP TABLE tab01

5. 分离表

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

分离表的使用方法如下:

  1. DETACH TABLE tabname

6. 附加表

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

  1. ATTACH TABLE tabname

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