如何将外键限制为孩子

问题描述 投票:-2回答:2

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

我如何限制这个字段只接受idchild实体的parents?

mysql sql relation erd
2个回答
2
投票

您可以使用圆形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)
);

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

然后,您需要添加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的组合。这会阻止父母选择一个不会引用它的孩子。

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));
© www.soinside.com 2019 - 2024. All rights reserved.