у меня есть следующие 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
?