表管理
当前版本: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
注意:附加表后,表原来的数据文件不会自动附加,请根据数据文件管理部分手动附加数据文件。