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

SQLite中如何禁止插入父值不在rowid内的记录以维持有向无环图表一致性

实现方案

你当前编写的触发器存在两处逻辑问题,调整后即可满足需求:

  • 原有校验逻辑仅覆盖了根节点(parent等于自身rowid)的场景,未对普通节点指向其他已存在rowid的场景做校验
  • 条件判断逻辑写反,没有正确匹配「parent不存在于rowid集合」的异常场景

修正后的触发器代码

CREATE TRIGGER parent_not_in_rowid
BEFORE INSERT ON Heap
FOR EACH ROW
BEGIN
 SELECT RAISE(FAIL, 'parent id inconsistent')
 WHERE 
  -- 排除根节点场景:parent等于自身rowid
  NEW.parent != NEW.rowid
  -- 校验parent不存在于已有rowid集合时抛出错误
  AND NOT EXISTS(SELECT 1 FROM Heap WHERE rowid = NEW.parent);
END;

补充说明

  • SQLite在BEFORE INSERT触发器中引用NEW.rowid时会提前生成自动分配的rowid值,因此根节点的DEFAULT rowid默认值可以被正确识别
  • 如果后续允许修改parent字段,需要额外新增BEFORE UPDATE触发器,复用相同的校验逻辑即可
  • 若需要进一步保证有向无环图的无环特性,可在触发器中新增递归校验逻辑,检查从NEW.parent出发是否存在指向当前新插入节点的路径,避免出现循环引用

内容的提问来源于stack exchange,提问作者Raoul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:54:05