上下文:
我正在尝试将具体的安装从版本8.3.2升级到8.4.1。执行此SQL语句期间,升级过程失败:
ALTER TABLE AreaLayoutsUsingPresets ADD CONSTRAINT FK_7A9049A1385521EA FOREIGN KEY (arLayoutID) REFERENCES AreaLayouts (arLayoutID) ON UPDATE CASCADE ON DELETE CASCADE
使用:
SQLSTATE[HY000]: General error: 1005 Can't create table `concrete5`.`#sql-215_264a4` (errno: 121 "Duplicate key on write or update")
调查我的数据库后发现,在information_schema
的{{1}}中有以下条目:
INNODB_SYS_FOREIGN
问题:
现在我的理解是,我不能修改ID FOR_NAME REF_NAME N_COLS TYPE
concrete5/FK_7A9049A1385521EA concrete5/#sql-215_26264 concrete5/AreaLayouts 1 5
,因为它不是数据库,而只是系统的表格表示形式。
我想知道如何摆脱该外键输入。表information_schema
不存在(我无法在服务器上找到它,concrete5/#sql-215_26264
或alter table
也找不到该表(我尝试使用drop table
前缀和没有它))。因此,更改表删除外键的直接方法失败了,因为它找不到表。
我想我可能会弄乱升级脚本,以便它创建一个新的外键ID,但是我宁愿摆脱数据库中的那个僵尸。我已经尝试禁用外键检查,然后导致错误,告诉我不能将键添加到系统表中(因为它已经在系统表中了)。
答案 0 :(得分:0)
重新安装很少能解决任何问题;但我很高兴它解决了您的问题。
诸如#sql_...
之类的表名通常来自ALTER
或类似DDL中间的崩溃。这样的文件可以删除。 information_schema
是通过查看文件得出的,因此我认为删除文件会杀死僵尸条目。
答案 1 :(得分:0)
在SQL导入之前加上SET FOREIGN_KEY_CHECKS=0;
或将其附加到查询ALTER TABLE
... DISABLE KEYS;
...最好在弄乱之前转储整个数据库。