gpt4 book ai didi

mysql - MySQL中的"Segemented"外键?

转载 作者:行者123 更新时间:2023-11-29 11:46:24 25 4
gpt4 key购买 nike

我在 MySQL 中遇到外键问题,或者可能我只是想错了方向...我有一个事件日志表,我需要在其中引用当前另外 2 个表中的键值。因此,我使用一个包含该外键值的字段以及一个指示该外键值来自哪个表的指示符。

Table activitylog
...
RefID INT NOT NULL,
RefType INT NOT NUL,
...

Table offers
OfferID INT NOT NULL,
...

Table orders
OrderID INT NOT NULL,
...

如果用户创建了报价,则报价表中的 OfferID 值将写入事件日志的 RefID,并且 RefType 设置为 1。如果是订单,则 OrderID 的值将写入 RefID,并且 RefType 设置为2.

当然,我可以添加一个附加字段,将其命名为 OrderID,将 RefID 重命名为 OfferID 并丢弃 RefType 并使用这些字段。但是,如果将来要使用新实体,我将必须添加一个附加字段来保存新实体的键值,而不是仅仅发明 RefType 3 并继续在 RefID 中保留键值。

我现在正在努力解决外部关键约束的定义。逻辑是如果 RefType = 1 则在 Offers 中查找键,如果 RefType = 2 则在 Orders 中查找键。

有人知道是否有办法实现我当前的概念,或者我是否必须向事件日志添加其他字段?

最佳答案

没有。 MySQL 不支持强制执行外键约束,就像您所解释的那样,单个列引用多个表。

您可以使用 MyISAM 引擎定义约束,但不会强制执行 FK 约束。

如果使用 InnoDB 引擎为表定义 FK 约束,则无论其他列中存储什么值,所有外键约束都将被强制执行。

要对表进行 FK 约束以引用两个(或更多)不同的独立父表,您需要两个(或更多)外键列,每个表一个。

使用 InnoDB 进行表设计时,您必须放弃声明性 FOREIGN KEY 约束。

您可以通过编写一些困惑的触发器来滚动自己的约束;当违反约束规则之一时,让触发器抛出异常。

关于mysql - MySQL中的"Segemented"外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863514/

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