Как вы привязываете внешний ключ к ребенку - PullRequest
0 голосов
/ 04 апреля 2019

A parent объект требует, чтобы один child объект был отмечен. Таким образом, я добавил поле marked_child_id.

Как бы я ограничил это поле, чтобы принимать только id с child сущностей parent?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы можете сделать это с круговой ссылкой 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, чтобы отмеченный_идентификатор_ссылки ссылался на первичный ключ дочерней таблицы:

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

Я внес изменения в вышеприведенное, чтобы ответить на ваши комментарии.

  • marked_child_id может иметь значение NULL, поэтому вы можете создать родительскую строку перед добавлением дочернего элемента.
  • Внешний ключ для selected_child_id должен ссылаться на комбинацию двух дочерних столбцов child_id и parent_id. Это не позволяет родителю выбрать ребенка, который не ссылается на него взамен.
0 голосов
/ 04 апреля 2019

Примечание. Это ответ на первоначальный вопрос до того, как он был отредактирован.


Сделайте идентификатор и родительский элемент уникальными в child и укажите его в 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));
...