sql - QuestDB 列定义检查约束,NOT NULL 和 CHECK(condition/s)
问题描述
我正在使用QuestDB存储来自我在现场的数百个传感器的温度和湿度测量值。每个传感器都由一个 id 唯一标识,并每分钟产生一个测量值(插入)。
这是我的表定义:
create table sensors(id symbol,
temperature int,
humidity int,
ts timestamp)
timestamp(ts) partition by MONTH;
我需要拒绝无效的插入。
有效插入定义为:
- id:不能为空
- 湿度:必须是 0 到 100 之间的值,但仅在温度高于 25C 时才有用。
有没有办法在 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;
解决方案
在标准 SQL 中,有几种方法可以定义约束(其中一些出现在示例中):
- 列约束,设置为列属性,例如
NOT NULL
. 查看 QuestDB 支持的语法CREATE TABLE
,这些不受支持。 - 检查约束,允许任意布尔值表达式。同样,QuestDB 的
CREATE TABLE
语法不支持这些。 - 索引约束。一些索引限制数据值,例如不允许主键为 NULL。目前,QuestDB 仅支持列索引(适用于
SYMB
相关模式),但似乎不限制列值(即索引仅用于查询效率,而不是数据完整性)。 - 触发器,允许在事件上执行代码,通常在执行DML查询(插入、更新和删除)时执行,并且可以中止数据更改。QuestDB SQL 参考没有提到触发器。
注意:在幕后,上面的某些内容可能没有区别(例如,某些列约束,例如PRIMARY
,可以转换为索引约束)。
约束数据的常用方法不可用,但还有其他选择。一种是创建一个视图并查询它,而不是原始表。不幸的是,QuestDB 不支持视图。
这留下了一个选择:在将数据传递到数据库之前检查数据。通常,您会避免让主机代码负责数据库任务,但这是假设 DBMS 支持这些任务。如果 DBMS 完全缺少某些功能,那么在主机代码中完成它是唯一的方法。
推荐阅读
- vue.js - 使用 prerender-spa-plugin 时如何加载 Vuetify?
- haskell - 哈斯克尔世界你好
- javascript - WebStorm 每个文件夹的不同 ESLint 配置
- vue.js - 如何使用参数解决 Vue 路由器更改错误?
- dart - Dart RegExp 不返回匹配项
- excel-formula - 如果今天的日期介于日期范围之间,则突出显示一个单元格
- swift - 在 Swift 中按下按钮时多次更新标签文本
- excel - 无法将表格与 Excel 中的 VBA 表头一起导出为 CSV
- typescript - 无法从 Firestore 获取文档
- java - 构建一个接受任何类型请求的休息包装器