為什麼删除空表會産生外鍵錯誤?
在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