您如何将外键约束给孩子

时间:2019-04-03 21:13:44

标签: mysql sql relation erd

parent实体需要 一个 child实体进行标记。因此,我添加了一个字段marked_child_id

我如何限制此字段只接受id的{​​{1}}个实体中的child个?

2 个答案:

答案 0 :(得分:1)

您可以使用循环FK参考进行此操作。这些很棘手,因为您必须在创建引用表之后才能声明外键约束。

CREATE TABLE parent (
  parent_id INT NOT NULL,
  marked_child_id INT,
  PRIMARY KEY (id)
);

CREATE TABLE child (
  child_id INT NOT NULL,
  parent_id INT NOT NULL,
  PRIMARY KEY (child_id),
  UNIQUE KEY (child_id, parent_id),
  FOREIGN KEY (parent_id) REFERENCES parent(parent_id)
);

上面创建了子->父引用,这是预期的。

然后,您需要添加FK约束,以便marked_child_id引用子表的主键:

ALTER TABLE parent
  ADD FOREIGN KEY (marked_child_id, parent_id) 
  REFERENCES child(child_id, parent_id); 

我已对以上内容进行了修改,以回复您的评论。

  • marked_child_id可能为NULL,因此您可以在添加子项之前创建父行。
  • marked_child_id的外键必须引用孩子的两列child_id和parent_id的 combination 。这样可以防止父母选择不作为回报的孩子。

答案 1 :(得分:0)

注意:这是对原始问题进行编辑之前的答案。


child中使ID和父项唯一,并在marker中对其进行引用。

CREATE TABLE parent
             (id integer,
              PRIMARY KEY (id));

CREATE TABLE child
             (id integer,
              parent_id integer,
              PRIMARY KEY (id),
              FOREIGN KEY (parent_id)
                          REFERENCES parent
                                     (id),
              UNIQUE (parent_id,
                      id));

CREATE TABLE marker
             (parent_id integer,
              child_id integer,
              PRIMARY KEY (parent_id),
              FOREIGN KEY (parent_id,
                           child_id)
                          REFERENCES child
                                     (parent_id,
                                      id));