无法截断外键约束中引用的表

Are*_*eba 5 mysql sql

无法截断外键约束中引用的表.我应该先做什么才能启用trancate?

ditails :( guacamole.guacamole_connection_history,CONSTRAINT guacamole_connection_history_ibfk_2FOREIGN KEY(connection_id)REFERENCES guacamole.guacamole_connection(connection_id))

我想清除guacamole_connection表进行开发测试.

数据库结构

Abh*_*oel 11

您可以通过跳过外键检查来截断.

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table1; 
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)


小智 5

TRUNCATE 它不等同于 DELETE:TRUNCATE 它是 DDL 操作,而 DELETE 是 DML 操作。换句话说,TRUNCATE 会改变表结构(即根据您正在处理的 RDBMS 释放存储空间并修改其他属性),而 DELETE 只是在执行模型指定的每个验证时修改数据(即前键约束、检查约束等) .)

为什么要截断表格?嗯,它更快,因为它不必运行任何验证(这就是为什么您的 FK 会影响截断操作),并允许您释放表(及其索引)当前分配的所有空间。

所以,如果你想截断你的表,你应该:

  1. DISABLE 相关 FK
  2. 截断所有相关表。
  3. 启用以前禁用的 FK

在内部,操作使用(再次取决于 RDBMS)相当于 DROP 和 CREATE FK。差异通常与所需的权限有关,因为从概念上讲,创建/删除 FK 与启用/禁用它不同


小智 3

为什么不添加一个约束添加ON DELETE CASCADEON UPDATE CASCADE?那么你需要做的就是TRUNCATE guacamole_connection CASCADE

例子:

ALTER TABLE 
    guacamole_connection_history 
ADD CONSTRAINT 
    guacamole_connection_history_cascade_delete 
    FOREIGN KEY (connection_id) 
    REFERENCES guacamole_connection (connection_id) 
    ON UPDATE CASCADE ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

然后运行TRUNCATE guacamole_connection CASCADE