为什么我可以删除但不能截断?

时间:2018-07-12 13:59:05

标签: mysql foreign-keys

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

+----+--------+---------+-----------+----------+---------------------+--------------+
| 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):无法截断外键约束(dbpage,CONSTRAINT FK_140AB62012469DE2外部键(category_id)中引用的表{{ 1}}。dbcategory))

我想开个玩笑,试试看:

id

令我惊讶的是,该命令有效。现在,我有一个需要的空表,但是不确定> delete from category where id != 0;为什么超过了外键检查而不是delete from吗?这背后有逻辑/理由吗?

1 个答案:

答案 0 :(得分:1)

delete命令将考虑级联删除(如果已启用),否则将失败。

Truncate仅作用于表,而不作用于链接的记录。 Truncate本质上是在不考虑其他表的情况下尝试删除该表的所有数据页和索引-外键约束阻止了这种情况。

截断实际上是drop table,然后创建具有相同架构的表。