DEFINE FIELD中VALUE @expression子句的用途及返回null问题排查
问题解答
VALUE @expression子句的作用
在SurrealDB中,DEFINE FIELD <field> ON <table> VALUE @expression用于为字段定义持久化默认值:当插入新记录时,若未显式指定该字段的值,系统会计算@expression的结果并将其存储到字段中。这个值是静态存储的,后续查询返回的是插入时计算好的固定值,而非每次查询时重新计算。
你的问题原因
- 默认值未触发:你用
CREATE test:some;创建记录时,空插入操作在SCHEMAFUL模式下没有触发VALUE字段的默认值逻辑,导致time字段根本没被创建,所以SELECT *看不到该字段,单独查询时返回null。 - 需求与子句不匹配:你期望每次查询都返回当前时间,这属于动态计算的虚拟字段场景,
VALUE子句无法满足——它仅在插入时计算一次,不支持实时计算。
解决方案
场景1:记录插入时的固定时间(创建时间)
如果要存储记录创建时的时间,修改CREATE语句触发默认值:
DEFINE TABLE test SCHEMAFUL; DEFINE FIELD time ON test VALUE time::now(); CREATE test:some SET {}; -- 显式执行空SET操作触发默认值 SELECT time FROM test:some; -- 返回记录创建时的时间
场景2:每次查询返回实时当前时间
如果需要每次查询都动态获取当前时间,改用COMPUTE子句定义虚拟字段:
DEFINE TABLE test SCHEMAFUL; DEFINE FIELD time ON test COMPUTE time::now(); CREATE test:some; SELECT time FROM test:some; -- 每次查询都会返回实时当前时间
关键区别
VALUE:计算结果会被持久化存储,仅在插入(或更新时未指定字段值)时计算一次。COMPUTE:不存储任何值,每次查询时都会重新计算表达式结果,返回实时值。
内容的提问来源于stack exchange,提问作者Juiko
相关产品推荐
相关产品推荐

