首页 > 解决方案 > QuestDB 列定义检查约束,NOT NULL 和 CHECK(condition/s)

问题描述

我正在使用QuestDB存储来自我在现场的数百个传感器的温度湿度测量值。每个传感器都由一个 id 唯一标识,并每分钟产生一个测量值(插入)。

这是我的表定义:

create table sensors(id symbol, 
                     temperature int, 
                     humidity int, 
                     ts timestamp) 
    timestamp(ts) partition by MONTH;

我需要拒绝无效的插入。

有效插入定义为:

有没有办法在 QuestDB 中表达这些约束?例如我可以这样做:

create table sensors(id symbol not null, 
                     temperature int, 
                     humidity int check (humidity >= 0 and humidity <= 100 and temperature > 25), 
                     ts timestamp) 
    timestamp(ts) partition by MONTH;

标签: sqlquestdb

解决方案


在标准 SQL 中,有几种方法可以定义约束(其中一些出现在示例中):

  1. 列约束,设置为列属性,例如NOT NULL. 查看 QuestDB 支持的语法CREATE TABLE,这些不受支持。
  2. 检查约束,允许任意布尔值表达式。同样,QuestDB 的CREATE TABLE语法不支持这些。
  3. 索引约束。一些索引限制数据值,例如不允许主键为 NULL。目前,QuestDB 仅支持列索引(适用于SYMB相关模式),但似乎不限制列值(即索引仅用于查询效率,而不是数据完整性)。
  4. 触发器,允许在事件上执行代码,通常在执行DML查询(插入、更新和删除)时执行,并且可以中止数据更改。QuestDB SQL 参考没有提到触发器。

注意:在幕后,上面的某些内容可能没有区别(例如,某些列约束,例如PRIMARY,可以转换为索引约束)。

约束数据的常用方法不可用,但还有其他选择。一种是创建一个视图并查询它,而不是原始表。不幸的是,QuestDB 不支持视图。

这留下了一个选择:在将数据传递到数据库之前检查数据。通常,您会避免让主机代码负责数据库任务,但这是假设 DBMS 支持这些任务。如果 DBMS 完全缺少某些功能,那么在主机代码中完成它是唯一的方法。


推荐阅读