为什么删除空表会产生外键错误?
在MySQL中,我有一个包含以下定义的表
CREATE TABLE `enterprise_rma` (
`entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'RMA Id',
`status` varchar(32) DEFAULT NULL COMMENT 'Status',
`is_active` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'Is Active',
`increment_id` varchar(50) DEFAULT NULL COMMENT 'Increment Id',
`date_requested` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'RMA Requested At',
`order_id` int(10) unsigned NOT NULL COMMENT 'Order Id',
`order_increment_id` varchar(50) DEFAULT NULL COMMENT 'Order Increment Id',
`store_id` smallint(5) unsigned DEFAULT NULL COMMENT 'Store Id',
`customer_id` int(10) unsigned DEFAULT NULL,
`customer_custom_email` varchar(255) DEFAULT NULL COMMENT 'Customer Custom Email',
PRIMARY KEY (`entity_id`),
KEY `IDX_ENTERPRISE_RMA_STATUS` (`status`),
KEY `IDX_ENTERPRISE_RMA_IS_ACTIVE` (`is_active`),
KEY `IDX_ENTERPRISE_RMA_INCREMENT_ID` (`increment_id`),
KEY `IDX_ENTERPRISE_RMA_DATE_REQUESTED` (`date_requested`),
KEY `IDX_ENTERPRISE_RMA_ORDER_ID` (`order_id`),
KEY `IDX_ENTERPRISE_RMA_ORDER_INCREMENT_ID` (`order_increment_id`),
KEY `IDX_ENTERPRISE_RMA_STORE_ID` (`store_id`),
KEY `IDX_ENTERPRISE_RMA_CUSTOMER_ID` (`customer_id`),
CONSTRAINT `FK_ENTERPRISE_RMA_CUSTOMER_ID_CUSTOMER_ENTITY_ENTITY_ID` FOREIGN KEY (`customer_id`) REFERENCES `customer_entity` (`entity_id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `FK_ENTERPRISE_RMA_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `core_store` (`store_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='RMA LIst';
我正在尝试DROP这个表,但每当我这样做时,我收到以下错误.
Cannot delete or update a parent row: a foreign key constraint fails
我不明白的是,桌子已经是空的.如果我SELECT * FROM enterprise_rma;,则不返回任何行(受影响的是0行)
和SHOW ENGINE INNODB状态;没有任何用处.
我知道我可以用以下方法解决这个问题
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE enterprise_rma;
SET FOREIGN_KEY_CHECKS=0;
但我不明白如果表中没有数据,外键约束如何失败.我不明白MySQL的外键模式是否有细微之处?当发生这种情况时,MySQL会被损坏还是处于无效状态?有自己排除故障的方法吗?
解决方法:
您不应该删除另一个依赖表的父表,即使它没有数据.因为如果删除父项,那么您将永远无法在子项中插入任何数据.您必须首先删除任何引用enterprise_rma的子表.
但是有些东西与你的描述不符.你说丢失表时遇到了问题,但是关于外键检查的例子显示你使用了DELETE.
DELETE与DROP TABLE不同. DELETE之后,表中没有行,但表仍然存在.在DROP TABLE之后,该表不存在,即如果运行SHOW TABLES则不会显示该表.
标签:mysql,foreign-key
来源: https://codeday.me/bug/20190806/1597420.html