postgresql - 如何防止 Postgresql 中链表中的循环引用?
问题描述
表格和有效数据如下:
| id | after_id |
| -- | -------- |
| a | null |
| b | a |
| c | b |
| d | c |
目标是防止类似的事情发生:
| id | after_id |
| -- | -------- |
| a | d | <- 'a' now follows 'd', creating a loop.
| b | a |
| c | b |
| d | c |
如果不存储一些有助于创建约束的附加信息,似乎不可能解决这个问题。但我无法弄清楚哪些信息会有所帮助。Postgresql 有EXCLUDE
约束,我想也许可以以某种方式使用重叠运算符。不知道如何解决这个问题,但我觉得它需要更新太多行,这将破坏将序列存储在链表中的全部意义。
UPD:这个想法是在数据库级别而不是应用程序级别确保列表的完整性。无效状态的另一个示例:
| id | after_id |
| -- | -------- |
| a | null |
| b | d | <- updated
| c | b |
| d | c |
或其他:
| id | after_id |
| -- | -------- |
| a | null |
| b | d | <- updated: followed 'a', now follows 'd'
| c | b |
| d | c |
| e | a | <- updated: followed 'd', now follows 'a', unique constraint on after_id will not be violated this way
解决方案
推荐阅读
- react-native - 您如何识别 Expo Push Notification Token 所属的 Expo 项目?
- javascript - Google 脚本 - Array.sort - compareFunction 的操作数反转?
- excel - 从动态范围内的单元格中删除最后一个逗号
- c# - Xamarin C# 将双嵌套集合绑定到代码中的 Switch IsToggledProperty
- clojurescript - Clojure 脚本。发生重新渲染时重置 Reagent 中的原子
- angular - 类型 'never' 必须有一个返回迭代器的 '[Symbol.iterator]()' 方法。打字稿
- r - 打印以逗号分隔,删除引号并在 R 中添加特殊引号
- excel - 如何从正确的位置/格式中抓取图像并将其粘贴到 excel 中?
- python-3.x - 字节串解码的两种形式
- r - 如何在 R 中为轴参数指定标签长度。我的标签名称被截断