表管理
当前版本:v3.0, 更新时间:2020-09-16
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, datetimeadd(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
注意:附加表后,表原来的数据文件不会自动附加,请根据数据文件管理部分手动附加数据文件。