2012-03-20 3 views
2

Итак, я пытался выяснить, почему я продолжаю получать эту конкретную ошибку. MySql продолжает давать мне код ошибки 1452. Невозможно добавить или обновить дочернюю строку. Мои таблицы таковы.Внешняя ошибка ключа

CREATE TABLE IF NOT EXISTS `ecommerce`.`departments` (
`id` INT NOT NULL AUTO_INCREMENT , 
`name` VARCHAR(100) NOT NULL , 
PRIMARY KEY (`id`)) 
ENGINE = MyISAM; 

INSERT INTO `ecommerce`.`departments` 
VALUES (1, 'Development'), (2, 'Marketing'), 
     (3, 'Sales'), (4, 'Customer Service'); 

CREATE TABLE IF NOT EXISTS `ecommerce`.`department_roles` (
`id` INT NOT NULL AUTO_INCREMENT , 
`name` VARCHAR(100) NOT NULL , 
`map` VARCHAR(255) NOT NULL , 
`parent_id` INT NOT NULL , 
PRIMARY KEY (`id`)) 
ENGINE = MyISAM; 

INSERT INTO `ecommerce`.`department_roles` 
VALUES (1, 'Admin', '/admin', 0), (2, 'Create', '/admin', 1), 
     (3, 'Update', '/admin', 1), (4, 'Delete', '/admin', 1); 

CREATE TABLE IF NOT EXISTS `ecommerce`.`department_roles_map` (
`id` INT NOT NULL AUTO_INCREMENT , 
`department_roles_id` INT NOT NULL , 
`departments_id` INT NOT NULL , 
PRIMARY KEY (`id`) , 
INDEX `fk_drm_departments` (`departments_id` ASC) , 
INDEX `fk_drm_department_roles` (`department_roles_id` ASC) , 
CONSTRAINT `fk_drm_departments` 
    FOREIGN KEY (`departments_id`) 
    REFERENCES `ecommerce`.`departments` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
CONSTRAINT `fk_drm_department_roles` 
    FOREIGN KEY (`department_roles_id`) 
    REFERENCES `ecommerce`.`department_roles` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

Теперь, когда я пытаюсь выбрать из отделов и department_roles, я показываю данные.

SELECT * FROM department_roles; 
+----+--------+--------+-----------+ 
| id | name | map | parent_id | 
+----+--------+--------+-----------+ 
| 1 | Admin | /admin |   0 | 
| 2 | Create | /admin |   1 | 
| 3 | Update | /admin |   1 | 
| 4 | Delete | /admin |   1 | 
+----+--------+--------+-----------+ 
4 rows in set (0.00 sec) 

SELECT * FROM departments; 
+----+--------+--------+-----------+ 
| id | name | map | parent_id | 
+----+--------+--------+-----------+ 
| 1 | Admin | /admin |   0 | 
| 2 | Create | /admin |   1 | 
| 3 | Update | /admin |   1 | 
| 4 | Delete | /admin |   1 | 
+----+--------+--------+-----------+ 
4 rows in set (0.00 sec) 

Но, когда я пытаюсь вставить в department_roles_map, я получаю это.

INSERT INTO department_roles_map(department_roles_id, departments_id) VALUES (1, 1); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ecommerce`.`department_roles_map`, CONSTRAINT `fk_drm_departments` FOREIGN KEY (`departments_id`) REFERENCES `departments` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION) 

Любая помощь будет высоко оценена!

ответ

1

Во-первых, я впечатлен тем, что вам удалось создать таблицу InnoDB, содержащую ссылки FK на две таблицы MyISAM!

Попробуйте создать все три таблицы с двигателем InnoDB и попробовать еще раз ....

+0

Это сработало! Благодаря! –

0

Оба родителя и таблицы ребенка нужно использовать механизм хранения InnoDB, но вы используете MyISAM для родительских таблиц.

Я предполагаю, что уже существует таблица с именем department_roles_map, поэтому при запуске CREATE TABLE IF NOT EXISTS она не работает, потому что таблица уже существует и игнорирует ошибку. Затем, когда вы пытаетесь вставить данные в другой department_roles_map, он не работает с ошибкой FK.

Но это только предположение.

Я согласен с Томом Маком, попробуйте создать все 3 таблицы с помощью InnoDB, но вы также должны подтвердить, что другие таблицы с этими именами уже не существуют.

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

  • Нет связанных вопросов^_^