【问题标题】:Cannot add or update a child row a foreign key constraint fails [duplicate]无法添加或更新外键约束失败的子行[重复]
【发布时间】:2018-06-17 00:57:08
【问题描述】:

1452 - 无法添加或更新子行:外键约束失败 (projectphp1707.#sql-e6c_cd, CONSTRAINT #sql-e6c_cd_ibfk_1 FOREIGN KEY (order_id) REFERENCES tbl_order (order_id)) H1>

表 1:

表 2:

CREATE TABLE `tbl_order` (
  `order_id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `cus_fullname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `total_price` double DEFAULT NULL,
  `active` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `tbl_payment` (
  `pay_id` int(50) NOT NULL,
  `pro_id` int(15) NOT NULL,
  `pay_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_adress` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_cardname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_cvc` int(3) NOT NULL,
  `pay_number` text COLLATE utf32_unicode_ci NOT NULL,
  `pay_mm` int(2) NOT NULL,
  `pay_yyyy` int(4) NOT NULL,
  `pay_totals` varchar(255) COLLATE utf32_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;

【问题讨论】:

  • 我通常会看到此错误,因为有一个子行引用了不再存在的父行。但鉴于您的问题缺乏数据,我们无法确定。
  • 能否包含您尝试执行的操作?不清楚这不是预期的行为,例如,如果您尝试在表 1 中插入一行,而表 2 中没有具有相应 order_id 的预先存在的行。

标签: mysql


【解决方案1】:

这发生在以下两种方式之一:

1- 您正在尝试向子表添加一条记录,并且您使用的外键值在父表的主键中不存在。

在这种情况下,请仔细检查该值是否存在于父表中。可能您正在输入父子记录,但父记录添加失败。在这种情况下,您必须停止,而不是忽略错误并继续添加子项。

2- 您的表没有像 ON DELETE CASCADE 这样的引用完整性,并且您从父表中删除了一条记录,然后您尝试从子表中更新一条记录,该子表的外键引用了删除记录父表。

在这种情况下,您可能希望删除子代而不是更新它们。考虑为您的表添加参照完整性。

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2015-10-08
    • 2020-10-04
    相关资源
    最近更新 更多