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;

现在,当我尝试从部门和部门角色中进行选择时,我会显示数据。

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)

任何帮助将非常感激!

4

2 回答 2

1

首先,令我印象深刻的是,您成功地创建了一个 InnoDB 表,该表具有对两个 MyISAM 表的 FK 引用!

尝试使用 InnoDB 引擎创建所有三个表并重试....

于 2012-03-20T16:04:00.677 回答
0

父表和子表都需要使用 InnoDB 存储引擎,但您将 MyISAM 用于父表。

我的猜测是已经有一个名为 department_roles_map 的表,所以当你运行CREATE TABLE IF NOT EXISTS它时它会失败,因为该表已经存在,并且忽略了错误。然后,当您尝试将数据插入到其他department_roles_map 时,它会因 FK 错误而失败。

但这只是一个猜测。

我同意 Tom Mac 的观点,尝试使用 InnoDB 创建所有 3 个表,但您还应该确认不存在具有这些名称的其他表。

于 2012-03-20T16:07:40.573 回答