2015-11-18 35 views
3

引用的表不能截断外键约束引用的表。 我应该先做些什么来启用trancate?不能截断外键约束

ditails: (。guacamoleguacamole_connection_history,约束guacamole_connection_history_ibfk_2外键(connection_id)参考文献guacamoleguacamole_connectionconnection_id))

我想清楚guacamole_connection表开发测试。

DB structure

+0

从guacamole_connection_history删除,然后从guacamole_connection删除。 – jarlh

+0

我必须转移所有连接的桌子吗? –

+1

是的,你这样做。首先深层次,然后继续前进 –

回答

2

为什么不加约束添加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;

然后只需运行TRUNCATE guacamole_connection CASCADE

+0

TRUNCATE guacamole_connection CASCADE;返回:#1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行'CASCADE'附近使用正确的语法。所有表都使用ON DELETE CASCADE创建,但没有ON UPDATE CASCADE。够了吗? –

+1

是的,你不需要更新,我只是添加'UPDATE'来表明你可以做到这一点。尝试没有更新。 – CAllen

0

一定要先从任何相关表中删除的条目。例如:

TRUNCATE TABLE guacamole_connection_history; 
TRUNCATE TABLE guacamole_connection; 
+0

我已经这样做了,但仍然得到相同的错误。也许图片会很有帮助。 –

1

截断它并不等同于DELETE:截断它的DDL操作,而DELETE是一个DML操作。换句话说TRUNCATE修改表结构(即释放存储和修改取决于RDBMS您正在使用的其他属性),而删除刚才修改的数据在执行你的模型已经指定(即foreing键约束每一个验证,检查约束,等等。)

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

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

  1. 禁止相关的FK
  2. 拦截所有相关的表。
  3. 启用先前禁用FKS

在内部操作使用是(再次取决于RDBMS)等效于DROP并创建FKS。通常涉及到需要的权限的不同概念是不一样的创建/删除FK比启用/禁用

8

你可以跳过外键检查截断。

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table1; 
SET FOREIGN_KEY_CHECKS = 1;