2012-09-12 2 views
0

Мне нужно создать две таблицы с двунаправленным отношением, как показано на рисунке ниже. enter image description here Но он всегда дает ошибку. Я использую следующий запрос для создания таблиц.Проблемы с двунаправленными отношениями MySQL и зеркальными внешними ключами

CREATE TABLE IF NOT EXISTS `rpt_operation` (
    `op_id` int(45) NOT NULL, 
    `component` int(45) NOT NULL, 
    `ideal_time` time NOT NULL, 
    `handling_time` time NOT NULL, 
    PRIMARY KEY (`op_id`), 

    INDEX (component), 
    FOREIGN KEY (component) 
    REFERENCES rpt_component(comp_id) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



CREATE TABLE IF NOT EXISTS `rpt_component` (
    `comp_id` int(45) NOT NULL, 
    `lot_code` int(60) NOT NULL, 
    `lot_color` varchar(60) NOT NULL, 
    `drawing_num` int(60) NOT NULL, 
    `revision_num` int(60) NOT NULL, 
    `operation` int(45) NOT NULL, 
    PRIMARY KEY (`comp_id`), 

    INDEX (operation), 
    FOREIGN KEY (operation) 
    REFERENCES rpt_operation(op_id) 

) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ошибка появляется в строке component int(45) NOT NULL из rpt_operation таблицы. Любая помощь будет оценена по достоинству. Заранее спасибо

+0

Во-первых, это, скорее всего, из-за порядка команд, вы можете сначала создать обе таблицы, а затем установить на них индексы. Во всяком случае, «двунаправленное» отношение - это иногда подсказка к лучшему, но обе таблицы в одну большую таблицу (не могут иметь строку в rpt_operation без одного в rpt_component), так как я не вижу разрыва в нормализации, делая это. – Najzero

ответ

4

Ваша структура таблицы невозможна. Вы не можете вставлять какие-либо записи в rpt_operation, потому что нет записей в rpt_component для внешнего ключа component, и вы не можете вставлять какие-либо записи в rpt_component, потому что нет записей в rpt_operation для внешнего ключа operation.

Если вы сделаете один или оба из этих полеев обнуляемых, то структура таблицы еще рекурсивная, так что вы должны добавить один из внешних ключей вручную, например:

ALTER TABLE rpt_operation 
    ADD CONSTRAINT 
    FOREIGN KEY (component) 
    REFERENCES rpt_component(comp_id); 
+1

Циклическая зависимость может быть решена в другой СУБД, однако, используя отложенные ограничения. –

0

Я хотел бы предложить вам для устранения этой проблемы используйте таблицу ссылок. Это не является жизнеспособным решением и требует обходных решений.