首页 > 解决方案 > 为什么我可以删除但不能截断?

问题描述

所以我在一个表中有一堆测试行:

+----+--------+---------+-----------+----------+---------------------+--------------+
| id | name   | guru_id | parent_id | approved | created_ts          | last_edit_ts |
+----+--------+---------+-----------+----------+---------------------+--------------+
|  1 | PHP    |       1 |      NULL |        0 | 2018-07-12 14:27:05 | NULL         |
|  2 | HTML   |       1 |      NULL |        0 | 2018-07-12 14:33:21 | NULL         |
|  3 | CSS    |       1 |      NULL |        0 | 2018-07-12 14:34:54 | NULL         |
|  4 | test   |       1 |      NULL |        0 | 2018-07-12 14:37:11 | NULL         |
|  5 | test   |       1 |      NULL |        0 | 2018-07-12 14:38:39 | NULL         |
|  6 | test   |       1 |      NULL |        0 | 2018-07-12 14:40:39 | NULL         |
|  7 | test   |       1 |      NULL |        0 | 2018-07-12 14:43:29 | NULL         |
|  8 | test   |       1 |      NULL |        0 | 2018-07-12 14:43:59 | NULL         |
|  9 | test   |       1 |      NULL |        0 | 2018-07-12 14:45:12 | NULL         |
| 10 | test   |       1 |      NULL |        0 | 2018-07-12 14:45:19 | NULL         |
| 11 | test   |       1 |      NULL |        0 | 2018-07-12 14:45:39 | NULL         |
| 12 | CSS    |       1 |      NULL |        0 | 2018-07-12 14:46:30 | NULL         |
| 13 | trey   |       1 |      NULL |        0 | 2018-07-12 14:48:47 | NULL         |
| 14 | trey   |       1 |      NULL |        0 | 2018-07-12 14:49:36 | NULL         |
| 15 | trey   |       1 |      NULL |        0 | 2018-07-12 14:50:52 | NULL         |
| 16 | ajax   |       1 |      NULL |        0 | 2018-07-12 14:51:23 | NULL         |
| 17 | jquery |       1 |      NULL |        0 | 2018-07-12 14:51:44 | NULL         |
+----+--------+---------+-----------+----------+---------------------+--------------+

我最终让我的代码按我想要的方式工作,所以我尝试TRUNCATE使用表格从新数据开始:

mysql> truncate category

返回此错误:

错误 1701 (42000):无法截断在外键约束 ( db. page, CONSTRAINT FK_140AB62012469DE2FOREIGN KEY ( category_id) REFERENCES db. category( id))中引用的表

我想作为一个笑话来绕过它试试这个:

> delete from category where id != 0;

令我惊讶的是,这个命令奏效了。现在我根据需要有一个空表,但不确定为什么delete from超过外键检查但没有truncate?这背后有什么逻辑/原因吗?

标签: mysqlforeign-keys

解决方案


一个delete命令将考虑级联删除(如果它打开),如果不是,则失败。

Truncate只会作用于表而不是链接的记录。Truncate基本上试图删除表的所有数据页和索引而不考虑其他表 - 外键约束阻止了这一点。

截断drop table之后是创建相同模式的表。


推荐阅读