【发布时间】:2018-12-20 19:13:13
【问题描述】:
所以我在一个表中有一堆测试行:
+----+--------+---------+-----------+----------+---------------------+--------------+
| 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, CONSTRAINTFK_140AB62012469DE2FOREIGN KEY (category_id) REFERENCESdb.category(@98765433) @))
我以为是个玩笑,可以试试这个:
> delete from category where id != 0;
令我惊讶的是,该命令奏效了。现在我有一个所需的空表,但不确定为什么delete from 超过了外键检查而不是truncate?这背后有什么逻辑/原因吗?
【问题讨论】:
-
删除命令将考虑级联删除(如果已启用)。截断只会作用于表而不是链接的记录。
-
此表是否包含外键或者此表中的值是否是另一个表的外键?听起来像后者,在这种情况下,我希望
DELETE可以工作,但截断会失败...... -
@Dragonthoughts 哦,我明白了,所以 truncate 只是试图强制清除,而 delete 则执行整个级联操作?
-
@Dragonthoughts 啊我明白了,如果您想添加答案,请随意,我可以标记为已接受 :)
-
谢谢。我真的没想到它大到足以成为答案:)
标签: mysql foreign-keys