MySQL error 1452 - Cannot add or a child row: a foreign key constraint fails
mysqlmysqli database
要理解错误 1452,首先我们需要创建一个表,并借助外键约束将其与另一个表关联。
创建第一个表 −
mysql> CREATE table ForeignTable -> ( -> id int, -> name varchar(200), -> Fk_pk int -> ); Query OK, 0 rows affected (0.43 sec)
成功创建第一张表后,我们将创建第二张表 −
mysql> CREATE table primaryTable1 -> ( -> Fk_pk int, -> DeptName varchar(200), -> Primary key(Fk_pk) -> ); Query OK, 0 rows affected (0.48 sec)
现在,我们已经创建了两个表。然后,借助 alter 命令以及添加外键约束,将两个表关联起来。语法如下 −
alter table yourFirstTable add constraintName foreign key(column_name,在第二个表中充当外键) yourSecondTable(column_name,在第二个表中充当主键)。
现在,上述查询用于关联两个表。如下所示 −
mysql> alter table ForeignTable add constraint constFKPK foreign key(Fk_pk) references primaryTable1(Fk_pk); Query OK, 0 rows affected (1.57 sec) Records: 0 Duplicates: 0 Warnings: 0
现在,两个表都关联起来了。记录按如下方式插入到表 ‘foreignTable’ −
mysql> INSERT into ForeignTable values(1,'John',1);
这会导致错误,如下面的输出所示 −
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`business`.`foreigntable`, CONSTRAINT `constFKPK` FOREIGN KEY (`Fk_pk`) REFERENCES `primarytable1` (`fk_pk`))
在上面的输出中,我们得到了错误"无法添加或更新子行:外键约束失败"。我们可以通过将记录插入到表 primaryTable1 中来消除此错误,如下所示 −
mysql> INSERT into primaryTable1 values(1,'ComputerScience'); Query OK, 1 row affected (0.14 sec)
将记录插入表 primaryTable1 后,我们可以将所需的记录插入表 ForeignTable 中,而不会出现任何错误。如下所示 −
mysql> INSERT into ForeignTable values(1,'John',1); Query OK, 1 row affected (0.13 sec)
现在我们可以通过select命令来显示ForeignTable的表记录,如下 −
mysql> SELECT * from ForeignTable;
上述查询的输出是 −
+------+------+-------+ | id | name | Fk_pk | +------+------+-------+ | 1 | John | 1 | +------+------+-------+ 1 row in set (0.00 sec)
我们还可以使用select命令显示primarytable1的表记录,如下所示−
mysql> SELECT * from primarytable1;
上述查询的输出为 −
+-------+-----------------+ | Fk_pk | DeptName | +-------+-----------------+ | 1 | ComputerScience | +-------+-----------------+ 1 row in set (0.00 sec)
error 1452 - 无法添加或更新子行:当数据记录最初插入到 ForeignTable 时,外键约束失败。
Note: First, add the record into the second table i.e primarytable1 to avoid the above error.