无法截断外键约束中引用的表.我应该先做什么才能启用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 会影响截断操作),并允许您释放表(及其索引)当前分配的所有空间。
所以,如果你想截断你的表,你应该:
在内部,操作使用(再次取决于 RDBMS)相当于 DROP 和 CREATE FK。差异通常与所需的权限有关,因为从概念上讲,创建/删除 FK 与启用/禁用它不同
小智 3
为什么不添加一个约束添加ON DELETE CASCADE和ON 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