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