2013-11-28 4 views
0

у меня есть следующие 2 таблицы - tree_hierarchy:сервер MySQL не может создавать сложные ограничения

tree_hierarchy | CREATE TABLE `tree_hierarchy` (
    `tree_id` int(10) unsigned NOT NULL, 
    `time_segment` date NOT NULL, 
    `parent_node_id` int(10) unsigned NOT NULL, 
    `child_node_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`tree_id`,`time_segment`,`parent_node_id`,`child_node_id`), 
    KEY `fk_tree_hierarchy_child_node_idx` (`child_node_id`,`time_segment`), 
    KEY `fk_tree_hierarchy_parent_node_idx` (`parent_node_id`,`time_segment`), 
    KEY `fk_tree_hierarchy_tree_id_idx` (`tree_id`), 
    KEY `fk_tree_hierarchy_child_def` (`time_segment`), 
    CONSTRAINT `fk_tree_hierarchy_tree_id` FOREIGN KEY (`tree_id`) REFERENCES `tree` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

и node_instance:

node_instance | CREATE TABLE `node_instance` (
    `id` int(10) unsigned NOT NULL, 
    `node_id` int(10) unsigned NOT NULL, 
    `time_segment` date NOT NULL, 
    `name` varchar(128) NOT NULL, 
    `sharing` enum('Private','Inherited','User','Open') NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `unique_node_ts` (`time_segment`,`node_id`), 
    KEY `fk_node_instance_node_1` (`node_id`), 
    KEY `fk_node_instance_time_segment_idx` (`time_segment`), 
    CONSTRAINT `fk_node_instance_node_id` FOREIGN KEY (`node_id`) REFERENCES `node` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_node_instance_time_segment` FOREIGN KEY (`time_segment`) REFERENCES `time_segment` (`segment`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

При попытке поставить ограничение:

ALTER TABLE `tree_hierarchy` ADD CONSTRAINT `fk_tree_hierarchy_child_xyz` 
    FOREIGN KEY (`child_node_id` , `time_segment`) 
    REFERENCES `node_instance` (`node_id` , `time_segment`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

Я получаю:

ERROR 1005 (HY000): Can't create table 'empty_structure.#sql-4e8_28b1' (errno: 150) 

Это означает, что моя структура не в порядке. Но я думаю, что оба поля (node_id и time_segment одинаковы в обеих таблицах). Когда я создаю простые ограничения, все в порядке:

ALTER TABLE `tree_hierarchy` ADD CONSTRAINT `fk_tree_hierarchy_child_abcd` 
    FOREIGN KEY (`time_segment`) 
    REFERENCES `node_instance` (`time_segment`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

Query OK, 0 rows affected (0.41 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

и

ALTER TABLE `tree_hierarchy` ADD CONSTRAINT `fk_tree_hierarchy_child_efgh` 
    FOREIGN KEY (`child_node_id`) 
    REFERENCES `node_instance` (`node_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

Query OK, 0 rows affected (0.19 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

Я убедился, что иностранные имена ключей различны (уведомление хуг, ABCD, EFGH суффикса).

Что случилось с бывшим ADD CONSTRAINT?

ответ

0

Через некоторое время я обнаружил, что в node_instance мне не хватает соответствующего сложного ключа (node_id, time_segment). Вместо этого у меня есть (time_segment, node_id) - и именно поэтому mysql терпит неудачу. После добавления отсутствующего ключа все идет нормально.

Смежные вопросы