Atm*_*tma 4 mysql foreign-keys
我有以下表格:
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`)
)
Run Code Online (Sandbox Code Playgroud)
我能够截断 company_investorfundinground。
我尝试删除 company_fundinground,但出现错误:
无法截断外键约束中引用的表 company_funding_round_id_8edc4cc4_fk_companies_fundinground_id
如果 company_investorfundinground 被完全截断,为什么我会收到此错误?
TRUNCATE TABLE 相当于删除表并将其重新创建为新表。这会破坏外键引用。
它在https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html 中说:
从逻辑上讲,TRUNCATE TABLE 类似于删除所有行的 DELETE 语句,或一系列 DROP TABLE 和 CREATE TABLE 语句。为了实现高性能,它绕过了删除数据的 DML 方法。因此,它不能回滚,它不会导致 ON DELETE 触发器触发,并且不能对具有父子外键关系的 InnoDB 表执行。
换一种方式考虑:如果 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4574 次 |
| 最近记录: |