2017-10-19 57 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;