gpt4 book ai didi

database - 跨表复制列以强制执行检查约束是个好主意吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:51 25 4
gpt4 key购买 nike

我面临这样的情况,我有两个表:A 和 B。B 有一个指向 A 的外键。

A 有一个“详细信息”列,用于标识其在 B 中的子项是否需要填写其“详细信息”部分。

如果我有我的精简结构,我无法确定 B 中的记录是否需要填写其“详细信息”部分,即不为空,而不加入 A。因此,我唯一的方法是防止有人将这些记录插入或更新为无效状态是有一个触发器与 A 连接并检查其“详细”列。

我的感觉是约束比触发器更好,因为除了过滤器之外,它们更像是关于数据的事实,而触发器只是过滤器。

我可以通过复制 B 中的“Detailed”列然后设置检查约束(Detailed = 'Y' AND Details IS NOT NULL)或(Detailed = 'N')来解决这个问题

关于解决此问题的最佳方法的想法?

最佳答案

您提到的所有工具(约束和触发器)只是一种在数据库中强制执行数据一致性的方法。

简单的业务规则,如“总是有一个引用”、“没有一个 NULL”等是可以通过约束强制执行的。

应该使用触发器强制执行更复杂的业务规则,例如您在此处提到的规则。

约束并不比触发器“更好”或“更差”:它们只是您需要经常实现的规则的快捷方式。

对于您的任务,只需实现一个触发器。

但是,在 Oracle 中,约束和触发器都不是以纯基于集合的方式实现的。对于受 DML 操作影响的每条记录,它们在循环中被调用。

最有效的方法是创建一个包,作为针对您的表的所有 DML 的单一入口点,并检查该包中的详细信息

关于database - 跨表复制列以强制执行检查约束是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com