天天看點

mysql 外鍵notnull,MySQL外鍵阻止删除表 – 但表是空的

為什麼删除空表會産生外鍵錯誤?

在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