2017-10-19 10 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を削除しようとするが、私はエラーを取得:companies_investorfundingroundが完全に切り捨てられる場合

Cannot truncate a table referenced in a foreign key constraint companies_funding_round_id_8edc4cc4_fk_companies_fundinground_id

は、なぜ私はこのエラーを取得していますか?

+0

私はあなたがDELETE CASCADE句をON使用して試すことができ思う:あなたは子テーブルを動揺しないことを確かに知っている場合

、あなたは回避策を持っています。 –

答えて

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表を迅速かつ効率的なことになっている場合、それは任意の参照を持っているかどうかを確認するために、子テーブルをチェックするために時間を費やす価値があります行?そのテーブルは何百万もの行を持ちますが、すべての行の外部キー列には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; 
関連する問題