【问题标题】:Cannot delete or update a parent row, a foreign key constraint fails无法删除或更新父行,外键约束失败
【发布时间】:2018-01-10 01:46:05
【问题描述】:

执行此删除代码时:

$update = "DELETE from  `products`  WHERE `product_code` = $id; ";
$updateResult = mysqli_query($link, $update) OR DIE("Update Query Error ".mysqli_error($link)."Query [".$update ."]");

它说一个错误:

更新查询错误 无法删除或更新父行:外键约束失败 (gibson_db.trans, CONSTRAINT prod_trans_fk FOREIGN KEY (product_code) REFERENCES products (product_code))查询[从products 删除product_code = 1; ]

这是我的相关表格:

CREATE TABLE IF NOT EXISTS `products` (
  `product_code` int(4) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(2500) NOT NULL,
  `description` varchar(1000) DEFAULT 'N/A',
  `price` float NOT NULL DEFAULT '0',
  `quantity` int(11) NOT NULL DEFAULT '0',
  `product_type` int(4) NOT NULL,
  `img_path` varchar(255) NOT NULL DEFAULT 'products/',
  PRIMARY KEY (`product_code`),
  KEY `prod_type_fk` (`product_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;

INSERT INTO `products` (`product_code`, `product_name`, `description`, `price`, `quantity`, `product_type`, `img_path`)

CREATE TABLE IF NOT EXISTS `producttype` (
  `product_type` int(4) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL DEFAULT 'N/A',
  PRIMARY KEY (`product_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `producttype` (`product_type`, `description`)

ALTER TABLE `products`
  ADD CONSTRAINT `prod_type_fk` FOREIGN KEY (`product_type`) REFERENCES `producttype` (`product_type`);

【问题讨论】:

  • 什么是prod_trans_fk
  • 这是我另一个名为 trans.ALTER TABLE trans 的表上的约束名称 ADD CONSTRAINT prod_trans_fk FOREIGN KEY (product_code) REFERENCES products (product_code),添加约束user_trans_fk外键(user_code)参考user_tbluser_code);`
  • 检查我的答案,它会解决你的问题
  • @sumit,好的先生。我会尽力。谢谢!
  • 这就是它出错的原因,因为当您删除products 时,trans 表中的子记录会变成孤立的。您可以使用@sumit 的回答来解决您的问题。

标签: php sql database


【解决方案1】:

您的 Product 表与其他一些表有关系,可能是 trans 约束 prod_trans_fk当您尝试删除父记录以避免孤立数据时,通常 innodb 会抛出错误。以下是一些替代方案

  1. 删除第一条子记录
  2. 在删除父项时使用级联删除所有子记录。(可能很危险,例如:删除产品时可能会丢失所有交易)
  3. 使用软删除(将 is_deleted 等标志设置为是或否)(强烈推荐)

【讨论】:

  • 对典型的修复方法进行很好的分解,唯一的注意是它是以下之一,而不是全部
猜你喜欢
  • 2017-06-11
  • 2019-05-25
  • 2014-11-11
  • 2018-05-12
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多