" Segemented" MySQL中的外键?

时间:2016-01-18 20:28:09

标签: mysql

我在MySQL中遇到外键问题,或者我只是想错误的方向...我有一个活动日志表,我需要从当前其他2个表中引用键值。所以我使用的是一个包含该外键值的字段以及一个指示该外键值来自哪个表的指示符。

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

Table offers
    OfferID INT NOT NULL,
    ...

Table orders
    OrderID INT NOT NULL,
    ...

如果用户创建了商品,则表Offer中的OfferID值将被写入活动日志的RefID,RefType将被设置为1.如果是订单,则OrderID的值进入RefID,RefType设置为2.

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

我现在正在努力解决外围关键约束的问题。逻辑将是如果RefType = 1查找商品中的键,如果RefType = 2进入订单。

有人知道是否有办法实现我目前的概念,还是我必须在活动日志中添加其他字段?

1 个答案:

答案 0 :(得分:1)

没有。 MySQL不支持执行FOREIGN KEY约束,就像您解释的那样,引用多个表的单个列。

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

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

要在表上使用FK约束来引用两个(或更多)不同的独立父表,您需要两个(或更多)外键列,每个表一个。

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

你可能有可能通过编写一些杂乱的触发器来滚动你自己的约束;当违反其中一个约束规则时触发器会抛出异常。