引用的表不能截断外键约束引用的表。 我应该先做些什么来启用trancate?不能截断外键约束
ditails: (。guacamole
guacamole_connection_history
,约束guacamole_connection_history_ibfk_2
外键(connection_id
)参考文献guacamole
guacamole_connection
(connection_id
))
我想清楚guacamole_connection表开发测试。
引用的表不能截断外键约束引用的表。 我应该先做些什么来启用trancate?不能截断外键约束
ditails: (。guacamole
guacamole_connection_history
,约束guacamole_connection_history_ibfk_2
外键(connection_id
)参考文献guacamole
guacamole_connection
(connection_id
))
我想清楚guacamole_connection表开发测试。
为什么不加约束添加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;
然后只需运行TRUNCATE guacamole_connection CASCADE
TRUNCATE guacamole_connection CASCADE;返回:#1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行'CASCADE'附近使用正确的语法。所有表都使用ON DELETE CASCADE创建,但没有ON UPDATE CASCADE。够了吗? –
是的,你不需要更新,我只是添加'UPDATE'来表明你可以做到这一点。尝试没有更新。 – CAllen
一定要先从任何相关表中删除的条目。例如:
TRUNCATE TABLE guacamole_connection_history;
TRUNCATE TABLE guacamole_connection;
我已经这样做了,但仍然得到相同的错误。也许图片会很有帮助。 –
截断它并不等同于DELETE:截断它的DDL操作,而DELETE是一个DML操作。换句话说TRUNCATE修改表结构(即释放存储和修改取决于RDBMS您正在使用的其他属性),而删除刚才修改的数据在执行你的模型已经指定(即foreing键约束每一个验证,检查约束,等等。)
你为什么要截断表?那么它的速度更快,因为它不需要运行任何验证(这就是为什么你的FK影响截断操作的原因),并且允许你释放表(及其索引)当前分配的所有空间。
所以,如果你想你的截断表,你应该:
在内部操作使用是(再次取决于RDBMS)等效于DROP并创建FKS。通常涉及到需要的权限的不同概念是不一样的创建/删除FK比启用/禁用
你可以跳过外键检查截断。
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
SET FOREIGN_KEY_CHECKS = 1;
从guacamole_connection_history删除,然后从guacamole_connection删除。 – jarlh
我必须转移所有连接的桌子吗? –
是的,你这样做。首先深层次,然后继续前进 –