只允许两个表之一引用基表的约束

发布于 2024-11-15 02:43:42 字数 221 浏览 2 评论 0原文

我有3张桌子。一个基表,称为表 A,以及两个引用表 A 的表,称为表 X 和表 Y。X 和 Y 都有一个引用表 A 的外键约束。X 和 Y 的外键也是它们自己的外键主键。

我想知道是否可以添加一个约束,仅允许这些表之一包含引用表 A 的记录。因此,如果 X 有一条引用 A 的记录,则 Y 不能有一条记录,如果 Y有一条引用 A 的记录,则 X 不能有该记录。

这可能吗?

谢谢,

I have 3 tables. A base table, call it Table A, and two tables that reference Table A, Call them Table X and Table Y. Both X and Y have a foreign key contraint that references Table A. The Foreign Key of X and Y is also their own Primary Key.

I'd like to know if it is possible to add a constraint that will only allow one of these tables to contain a recrod that references Table A. So if X has a record that references A then Y can't have one and if Y has a record that references A then X can't have one.

Is this possible?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

好菇凉咱不稀罕他 2024-11-22 02:43:42

UDF 的 CHECK 约束(这是 Oded 的答案)不能很好地扩展并且并发性很差。请参阅这些:

所以:

  • 创建一个新表,比如 TableA2XY
  • 这有 PK TableA 和 char(1) 列,其中 CHECK 只允许 X 或 Y。并且对 A 的 PK 也有唯一约束。
  • tableX 和 tableY 有新的 char(1) 列,并进行检查以仅允许 X 或 Y 分别
  • tableX 和 tableY 在两列上都有其到 TableA2XY 的 FK

这是所有的超键或子类型方法

  • DRI 基于
  • 无触发器,
  • 没有在 CHECK 约束中具有表访问的 udf。

CHECK constraints with UDFs (which is Oded's answer) don't scale well and have poor concurrency. See these:

So:

  • create a new table, say TableA2XY
  • this has the PK of TableA and a char(1) column with a CHECK to allow ony X or Y. And a unique constraint on the PK of A too.
  • tableX and tableY have new char(1) column with a check to allow only X or Y respectively
  • tableX and tableY have their FK to TableA2XY on both columns

This is the superkey or subtype approach

  • all DRI based
  • no triggers
  • no udfs with table access in CHECK constraints.
凉栀 2024-11-22 02:43:42

是的,可以使用 CHECK 约束

除了正常的外键约束之外,您还需要添加 CHECK 约束 在两个引用表上,以确保另一个引用表中未使用外键。

Yes, this is possible using CHECK constraints.

Apart from the normal foreign key constraint, you will need to add a CHECK constraint on both referencing tables to ensure that a foreign key is not used in the other referencing table.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文