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

时间:2014-11-02 06:05:43

标签: mysql database rdbms

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

这是我的桌子的制作方式:

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;

然后它还有一些附带的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

此处还有' 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;

然后它会闪现这个错误:

  

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

现在,令我困惑的是,没有其他表条目使用我正在删除的条目' product'表。这种删除应该顺利进行。

所以,我尝试在产品上删除我的TRIGGER'表和BLAM,删除是成功的 这意味着错误在于我的TRIGGER,你能帮我指出究竟在哪里(如果不在触发器上)以及为什么错误发生了。

3 个答案:

答案 0 :(得分:4)

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

尝试从product_audit删除外键约束。

由于您没有显示{{1}}的表格定义,因此上述内容就是猜测。 (在撰写本文时,就是这样。但我的猜测是正确的!)

答案 1 :(得分:2)

您在delete表中尝试product的条目与其他表格相同parent。这意味着,如果您尝试从product表中删除product_id=1表中的条目,则必须确保首先删除所有对此条目进行更新的条目。

假设您有一个名为user

的表格
+--------+-------+--------+
| UserID | Name  | Gender |
+--------+-------+--------+
| 1      | Jason | Male   |
+--------+-------+--------+
| 2      | Sara  | Female |
+--------+-------+--------+
| 3      | John  | Male   |
+--------+-------+--------+

你有一个表user_address引用user表,其中user_id是外键。

+-----------+-----------+--------+
| AddressID | Address   | UserID |
+-----------+-----------+--------+
| 1         | Address A | 1      |
+-----------+-----------+--------+
| 2         | Address B | 1      |
+-----------+-----------+--------+
| 3         | Address C | 2      |
+-----------+-----------+--------+

现在,如果您想在user上运行删除查询,请执行以下操作:

delete from user where userID=1;

您必须确保删除所有子项(依赖项),在此游戏中Address AAddress B

答案 2 :(得分:0)

您可以通过运行以下查询来检查product_id是否在任何其他表格中用作FOREIGN KEY

SELECT    constraint_name,    table_name
 FROM    information_schema.table_constraints 
 WHERE  constraint_type = 'FOREIGN KEY'
  AND table_schema = DATABASE()
  AND constraint_name LIKE '%product_id%'
ORDER BY    constraint_name;`