我有一个表,其中所有操作都会影响单行(插入和更新,没有删除,但如果有,它们也将是单独的)。我正在考虑在检查约束中使用 UDF,这样我可以确保字段值仅与另一个值结合使用(两个 FK,第一次使用 A=1,B=x 变得固定,所以如果x = 4 那么 A=1 永远不能与 B=3 或除 4 以外的任何东西匹配)。
除了插入/更新行时花费的额外时间之外,这样做的缺点是什么?
更新:该应用程序不提供在创建行后更改 A 列或 B 列的机制。
我有一个表,其中所有操作都会影响单行(插入和更新,没有删除,但如果有,它们也将是单独的)。我正在考虑在检查约束中使用 UDF,这样我可以确保字段值仅与另一个值结合使用(两个 FK,第一次使用 A=1,B=x 变得固定,所以如果x = 4 那么 A=1 永远不能与 B=3 或除 4 以外的任何东西匹配)。
除了插入/更新行时花费的额外时间之外,这样做的缺点是什么?
更新:该应用程序不提供在创建行后更改 A 列或 B 列的机制。
您可以将 A 和 B 列存储在单独的表中。确保您的表在 A 上有一个主键,并且在 (A,B) 上有一个唯一约束从您的表中引用 (A,B)。A 上的主键将保证每个 A 只有一个 B。只要从子表引用该行,没有 ON UPDATE CASCADE 的外键将确保 B 不会更改。
通常应避免在 CHECK 约束 (*) 中访问其他表的 UDF。
几乎没有用例它们的行为完全符合用户的预期,几乎可以肯定没有一个 SQL 引擎可以根据 CHECK 约束标准规定的语义正确地实现它们,简而言之,如果你这样做你几乎肯定会成为下一个在某个论坛上发布另一个“CHECK 约束不起作用”问题的人。
你说“触发器似乎更重”。你是对的。问题是您希望您的引擎能够从您的“简单”约束声明中推断出所有“繁重的任务”。这种期望是没有根据的。
(*) 一如既往,例外当然是那些“知道自己在做什么”的人。但如果你在其中,你一开始就不需要问任何事情。