错误 1451:1451:无法删除或更新父行:外键约束失败

Fas*_*sck 4 mysql database rdbms

我一直在寻找这个错误,并偶然发现了一些相同性质的问题,但据我了解,他们似乎担心更新问题。我的源于删除条目。

我的桌子是这样制作的:

CREATE TABLE `product` (
  `product_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT
 'represents unique identifier for every existing products',
  `code` varchar(20) NOT NULL,
  `name` varchar(45) NOT NULL COMMENT 'description',
  `price` decimal(11,4) NOT NULL,
  `short_name` varchar(10) NOT NULL COMMENT 
'name that can be used quickly to referenc or immediately know what is the product',
  `count` bigint(19) unsigned NOT NULL DEFAULT '0',
  `product_type_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `is_active` bit(1) NOT NULL DEFAULT b'0',
  PRIMARY KEY (`product_id`),
  KEY `product_product_typeFK_idx` (`product_type_id`),
  CONSTRAINT `product_product_typeFK` FOREIGN KEY (`product_type_id`) REFERENCES
 `product_type` (`product_type_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后它还有一些伴随TRIGGER插入一些数据:

USE `RFVPOS`;
DELIMITER $$
CREATE TRIGGER `Product_BDEL` BEFORE DELETE ON `product` FOR EACH ROW

BEGIN
    INSERT INTO `product_audit`
    (product_id,
    code, 
    name, 
    short_name, 
    price,
    count,
    delete_user,
    delete_date
    )

    values
    (OLD.product_id,
    OLD.code,
    OLD.name,
    OLD.short_name,
    OLD.price,
    OLD.count,
    CURRENT_USER(),
    NOW()
    );
END
Run Code Online (Sandbox Code Playgroud)

这也是“product_audit”的结构:

CREATE TABLE `product_audit` (
  `product_audit_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` mediumint(8) unsigned NOT NULL,
  `code` varchar(20) NOT NULL,
  `name` varchar(45) NOT NULL,
  `price` decimal(11,4) NOT NULL,
  `short_name` varchar(10) NOT NULL,
  `count` bigint(19) unsigned NOT NULL,
  `delete_user` varchar(45) NOT NULL,
  `delete_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`product_audit_id`),
  KEY `product_audit_productFK_idx` (`product_id`),
  CONSTRAINT `product_audit_productFK` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后就闪现这个错误:

错误 1451:1451:无法删除或更新父行:外键约束失败

现在,之前让我感到困惑的是,没有其他表条目使用我在“产品”表上删除的条目。这次删除应该会顺利进行。

因此,我尝试删除“产品”表上的触发器,然后删除成功。
这意味着错误出在我的触发器上,您能帮我指出具体位置(如果不在触发器上)以及错误发生的原因吗?

wol*_*her 5

在删除产品之前,您的触发器将插入到product_audit. 如果product_id中的列product_audit是 的外键product,则您无法product再从中删除该行,因为它是 中新创建的行的父级product_audit

尝试从 中删除外键约束product_audit

由于您没有显示 的​​表定义product_audit,因此上面是在这方面的猜测。(在撰写本文时,就是这样。但我的猜测是正确的!)