微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。