MySQL CHECK 约束基于分隔符分割的分层字符串

问题描述

我们的 MysqL (10.3.27-MariaDB) 数据库中有一个单列表:

CREATE TABLE `action` (
  `action_name` varchar(256) NOT NULL,PRIMARY KEY (`action_name`)
) ENGINE=InnoDB;
+-----------------+
| action_name     |
+-----------------+
| Foo             |
| Foo.Bar         |
| Foo.Bar.Qux     |
| Foo.Baz         |
| Foo.Baz.Abc     |
| Foo.Baz.Abc.Def |
| Qux             |
| Dog             |
+-----------------+

action_name 是分层的。 MysqL 缺乏 Postgres 的 LTREE 等价物,这意味着有很多复杂的解决方法来创建层次结构,这使得外键约束和查询变得非常困难,因此我们使用点分隔值代替。

这工作正常:我们的查询会根据点分隔符自动搜索所有可能的父值。这使得我们的外键约束变得简单易行,大大简化了我们的应用程序逻辑。但是,父节点的存在不受任何约束的强制执行,我们不希望将其留给我们的应用程序代码来强制执行。

我们的 MariaDB 版本似乎支持自定义检查约束。可以通过分隔符 (SUBSTRING_INDEX) 拆分值,也可以将它们重新连接在一起 (GROUP_CONCAT)。

我们如何执行这些要求?

  • 添加 Foo.Bar.Baz,需要已经存在 FooFoo.Bar(父母必须存在)
  • 删除 Foo.Bar,不得有任何子项(Foo.Bar.Baz 不得存在)
  • 不能以导致前两个条件中的任何一个失败的方式更新行。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)