2017-10-19 27 views
1

,我有以下表截断外键约束引用的表:无法从空表

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`) 
) 

我能够截断companies_investorfundinground。

我尝试删除companies_fundinground,但我得到的错误:

Cannot truncate a table referenced in a foreign key constraint companies_funding_round_id_8edc4cc4_fk_companies_fundinground_id

为什么会出现这个错误,如果companies_investorfundinground完全截断?

+0

我想你可以通过使用DELETE CASCADE子句尝试。 –

回答

2

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。

如果你肯定知道你会不会打乱子表,你有一个解决办法:

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;