MySql 1050 : MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists

标签 mysql sql

我尝试执行以下 ALTER TABLE 语句:

ALTER TABLE `my_table` ADD COLUMN `new_column` LONGTEXT NULL DEFAULT NULL AFTER `old_column`;

在执行脚本的过程中我得到了

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

看起来这让数据库处于不一致状态,因为没有添加新字段,当我尝试再次执行脚本时,我遇到了这个奇怪的错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists

我的数据库中没有#sql-ib520 表,所以根据我的理解,它一定是 MySQL 创建的一些临时表。

有没有人以前遇到过这个错误,我该如何解决? 谢谢

编辑 我试过亚历克斯建议的脚本,但我没有工作:

drop table `#mysql50##sql-ib520`;
ERROR 1051 (42S02): Unknown table 'my_db.#mysql50##sql-ib520'

更新 我将 Amazon RDS 与 MySQL 5.6.12 结合使用

最佳答案

我也在使用 AWS RDS 实例,并就此问题进行了大量阅读。虽然我没有找到很好的解决方案,但我通过以下方式解决了这个问题,只替换一个表而不是整个数据库。

如果你运行这个命令:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES

您可以看到数据库表的完整列表,包括通常不可见的孤立表。我的两个问题表是:

ID  NAME
407 my_database/#sql-ib379
379 my_database/users

因为当数据库崩溃时我正试图更改我的用户表。现在,如上所述,我无法运行任何进一步的 ALTER TABLE 命令,因为它试图为任何后续查询创建相同的临时表。我尝试了所有方法来删除孤立表,但是对于“my_database/”部分,这似乎是不可能的。我也不想删除并重新创建我的整个数据库,我注意到孤立表正在引用用户表的内部 ID (#sql-ib379),所以我想我会把它换掉。这是一个小的 MySQL 脚本,可以帮我解决这个问题:

-- temporarily disable foreign key checks
SET foreign_key_checks = 0;

-- replace this line with query to create a structural copy of the users table 
-- named users_copy, including foreign keys if you use them

-- copy everything from original table into new table
INSERT INTO `users_copy` SELECT * FROM `users`;

确保一切正常,然后运行:

-- rename the existing table
RENAME TABLE `users` TO `users_backup`;

-- in case the copy process took some time, and there were additional rows added 
-- to the original table, grab them and put them into the copy table
INSERT INTO `users_copy` SELECT * FROM `users_backup` WHERE `users_backup`.id > (SELECT MAX(id) FROM `users_copy`);

-- finally, rename the copy table to the original table name
RENAME TABLE `users_copy` TO `users`;

- re-enable foreign key checks
SET foreign_key_checks = 1;

如果你不使用外键,你现在应该可以开始了。我建议保留备份表以防万一,但是一旦删除该备份表,它也应该删除孤立表。 但是,如果您使用外键,请务必更新对原始表名(在本例中为用户)的所有引用!根据您设置外键的方式,依赖于用户的其他表现在将引用 users_backup,这可能会导致数据丢失问题。

希望这对您有所帮助。

关于MySql 1050 : MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325915/

相关文章:

python - 带有 scrapy 的警告 "_mysql was already imported"

php - php中多个表的UNION搜索

sql - 选择所有行在两列中具有相同值的记录

mysql - 如何使用sql检查文件可用性

php - 为 iPhone 游戏后端使用非专用网络托管 PHP/MYSQL 数据库

MySQL Pivot 准备语句 AS 整数错误

mysql LEFT JOIN 选择查询结果有限

mysql - 为什么这个建表SQL在MSSQL Server上可以工作,但在MySQL上却不行?

java - 调用存储过程时内存泄漏

javascript - 第二个相关下拉列表未填充数据