Cannot truncate a table referenced in a foreign key constraint from empty table
我有以下表格:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE TABLE `companies_investorfundinground` ( `id` int(11) NOT NULL AUTO_INCREMENT, `funding_round_id` int(11) NOT NULL, `investor_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `companies_funding_round_id_8edc4cc4_fk_companies_fundinground_id` (`funding_round_id`), KEY `companies_investor_investor_id_30d4fd3e_fk_companies_investor_id` (`investor_id`), CONSTRAINT `companies_funding_round_id_8edc4cc4_fk_companies_fundinground_id` FOREIGN KEY (`funding_round_id`) REFERENCES `companies_fundinground` (`id`), CONSTRAINT `companies_investor_investor_id_30d4fd3e_fk_companies_investor_id` FOREIGN KEY (`investor_id`) REFERENCES `companies_investor` (`id`) ) CREATE TABLE `companies_fundinground` ( `id` int(11) NOT NULL AUTO_INCREMENT, `funding_round_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `companies_fundinground_447d3092` (`company_id`), CONSTRAINT `companies_company_id_36dd5970_fk_companies_company_entity_ptr_id` FOREIGN KEY (`company_id`) REFERENCES `companies_company` (`entity_ptr_id`) ) |
我能够截断公司_investorfundinground。
我尝试删除companies_fundinground但我得到错误:
Cannot truncate a table referenced in a foreign key constraint companies_funding_round_id_8edc4cc4_fk_companies_fundinground_id
如果companies_investorfundinground被完全截断,为什么我会收到此错误?
TRUNCATE TABLE相当于删除表并将其重新创建为新表。 这会打破外键引用。
它在https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html中说:
Logically, TRUNCATE TABLE is similar to a DELETE statement that deletes all rows, or a sequence of DROP TABLE and CREATE TABLE statements. To achieve high performance, it bypasses the DML method of deleting data. Thus, it cannot be rolled back, it does not cause ON DELETE triggers to fire, and it cannot be performed for InnoDB tables with parent-child foreign key relationships.
考虑另一种方式:如果TRUNCATE TABLE应该快速有效,是否值得花时间检查子表以查看它是否有任何引用行? 该表可能有数百万行,但在所有行的外键列中都有NULL。
如果你肯定知道你不会扰乱子表,你有一个解决方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | mysql> create table p ( id int primary key ); mysql> create table f ( pid int, foreign key (pid) references p(id)); mysql> truncate table p; ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`test`.`f`, CONSTRAINT `f_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `test`.`p` (`id`)) mysql> set foreign_key_checks=0; mysql> truncate table p; mysql> set foreign_key_checks=1; |