You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DEFINE FIELD中VALUE @expression子句的用途及返回null问题排查

问题解答

VALUE @expression子句的作用

在SurrealDB中,DEFINE FIELD <field> ON <table> VALUE @expression用于为字段定义持久化默认值:当插入新记录时,若未显式指定该字段的值,系统会计算@expression的结果并将其存储到字段中。这个值是静态存储的,后续查询返回的是插入时计算好的固定值,而非每次查询时重新计算。

你的问题原因

  1. 默认值未触发:你用CREATE test:some;创建记录时,空插入操作在SCHEMAFUL模式下没有触发VALUE字段的默认值逻辑,导致time字段根本没被创建,所以SELECT *看不到该字段,单独查询时返回null。
  2. 需求与子句不匹配:你期望每次查询都返回当前时间,这属于动态计算的虚拟字段场景,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:50:51