使用唯一的复合索引为同一个表创建两个外键引用

时间:2014-12-28 13:10:33

标签: mysql unique-constraint referential-integrity

items表中的所有项目都有一个可以从item_category表格派生的类别。

+---------------------------------------------+
| items                                       |
+---------------------------------------------+
| id                 | PK                     |
+--------------------+------------------------+
| item_category_id   | FK(item_categories.id) |
+--------------------+------------------------+

item_category表引用自身。我想创建一个category-> sub-category-> sub-sub-category等系统。我不知道会有多少嵌套的子类别,所以我认为我最好的选择是将该结构包含在一个表中。如果item_category_idNOT NULL,则它具有父级,否则它是超级类别且没有父级。

+-------------------------------------------+
| item_categories                           |
+-------------------------------------------+
| id               | PK                     |
+------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+------------------+------------------------+

这就是我的问题所在。 doll_item表是数据透视表。基本上doll可以包含许多项目,item可以属于许多玩偶。但它还有更多。我想确保doll表中的每个doll_item,其对应的item来自一个唯一的类别。

我试图为每行item_category_id提供item;但是,我担心这种关系不会强制item_id表中的item_category_iditems必然来自同一行。如果没有这个要求,在doll_item表中添加后两行是没有意义的。

是否可以使用MySQL强制执行此操作?

+-------------------------------------------------------+
| doll_item                                             |
+-------------------------------------------------------+
| doll_id              | FK(dolls.id)                   |
+----------------------+--------------------------------+
| item_id              | FK(items.id)                   |
+----------------------+--------------------------------+
| item_category_id     | FK(items.item_category_id)     |
+----------------------+--------------------------------+
| unique(doll_item.doll_id, doll_item.item_category_id) |
+-------------------------------------------------------+

由于

1 个答案:

答案 0 :(得分:2)

  

我想确保对于doll_item表中的每个玩偶,[每个]对应的item来自[不同]类别

使用复合UNIQUE KEY

  

我担心此关系不会强制item_id表中的item_category_iditems必须来自同一行

使用化合物FOREIGN KEY。:

CREATE TABLE item (
  id INT NOT NULL,
  item_category_id INT NOT NULL,
  PRIMARY KEY (id),
  INDEX (id, item_category_id) -- see note below
);

CREATE TABLE doll_item (
  doll_id INT NOT NULL,
  item_id INT NOT NULL,
  item_category_id INT NOT NULL,
  PRIMARY KEY (doll_id, item_id),

  UNIQUE KEY (doll_id, item_category_id),

  FOREIGN KEY (item_id, item_category_id)
    REFERENCES item (id, item_category_id)

);

注意:in the referenced table, there must be an index where the referenced columns are listed as the first columns in the same order.