代码之家  ›  专栏  ›  技术社区  ›  treyBake user1850175

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

  •  0
  • treyBake user1850175  · 技术社区  · 6 年前

    所以我在一张桌子上放了一堆测试行:

    +----+--------+---------+-----------+----------+---------------------+--------------+
    | 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 ,约束 FK_140AB62012469DE2 外键( category_id )参考文献 分贝 是的。 category ( id ))

    我想开个玩笑试试这个:

    > delete from category where id != 0;

    令我惊讶的是,这个命令奏效了。现在我有一张空桌子,但不知道为什么 delete from 超过外键检查但没有 truncate 是吗?这背后有什么逻辑/原因吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dragonthoughts    6 年前

    一个 delete 命令将考虑级联删除(如果启用)或如果不启用则失败。

    Truncate 只在表上操作而不链接记录。 截断 本质上,尝试删除表的所有数据页和索引,而不考虑其他表-外键约束会阻止此操作。

    截断是有效的 drop table 然后创建相同架构的表。