MySQL - 多个外键,仅对单个检查约束有效

问题描述 投票:1回答:1

标题几乎说明了我的需要,但是我希望看到如何从表中获取两个外键约束,以及两个检查约束并关联一个检查约束,同时将第二个检查约束与第二个外键约束相关联。

例如,我有两张3桌,itemactionriskItem引用actionrisk,仅通过itemid我想要对多个外键进行条件引用,每个外键具有一个唯一的检查约束。

我将在检查约束中使用itemtype('Action'或'Risk')来确定我引用的表。

这是我的命令:

ALTER TABLE `projectaim`.`items`  
              ADD CONSTRAINT `fk_item_risk` FOREIGN KEY (`ItemID`) REFERENCES `projectaim`.`risks`(`RiskID`)
ADD CONSTRAINT ck_item_type CHECK (itemtype = 'Risk') 

这在MySQL中是否可行?

mysql foreign-keys polymorphic-associations check-constraints
1个回答
1
投票

听起来你正在尝试实现,其中给定列可以是引用几个父表中的任何一个的id。

外键约束引用一个父表。你不能使这些条件。这就是多态关联从根本上与关系约束不兼容的原因。

如果需要引用几个父表中的一个,一种方法是创建多个列,每个列都可以为空。然后,您可以使用检查约束或触发器来确保其中只有一个不为空。

CREATE TABLE items (
  Itemid INT NOT NULL PRIMARY KEY,
  Itemtype ENUM ('Action', 'Risk') NOT NULL,
  Actionid INT NULL,
  Riskid INT NULL,
  FOREIGN KEY (Actionid) REFERENCES actions (Actionid),
  FOREIGN KEY (Riskid) REFERENCES risks (riskid),
  CHECK (CASE Itemtype
         WHEN 'Action' THEN Actionid IS NOT NULL AND Riskid IS NULL
         WHEN 'Risk' THEN Riskid IS NOT NULL AND Actionid IS NULL
         END)
);

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.