Mysql 1050错误:“表已经存在”,但实际上并不存在该表。

88

我正在添加这个表格:

CREATE TABLE contenttype (
        contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT,
        class VARBINARY(50) NOT NULL,
        packageid INT UNSIGNED NOT NULL,
        canplace ENUM('0','1') NOT NULL DEFAULT '0',
        cansearch ENUM('0','1') NOT NULL DEFAULT '0',
        cantag ENUM('0','1') DEFAULT '0',
        canattach ENUM('0','1') DEFAULT '0',
        isaggregator ENUM('0', '1') NOT NULL DEFAULT '0',
        PRIMARY KEY (contenttypeid),
        UNIQUE KEY packageclass (packageid, class)
);

我收到了一个 1050 "table already exists" 的错误信息,

但是这张表并不存在。有什么想法吗?

编辑:添加更多细节,因为似乎大家都不相信我 :)

DESCRIBE contenttype

产生了以下结果:

1146 - 表 'gunzfact_vbforumdb.contenttype' 不存在

CREATE TABLE gunzfact_vbforumdb.contenttype(
contenttypeid INT UNSIGNED NOT NULL AUTO_INCREMENT ,
class VARBINARY( 50 ) NOT NULL ,
packageid INT UNSIGNED NOT NULL ,
canplace ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cansearch ENUM( '0', '1' ) NOT NULL DEFAULT '0',
cantag ENUM( '0', '1' ) DEFAULT '0',
canattach ENUM( '0', '1' ) DEFAULT '0',
isaggregator ENUM( '0', '1' ) NOT NULL DEFAULT '0',
PRIMARY KEY ( contenttypeid ) ,

返回:

1050 - 表 'contenttype' 已经存在


5
你如何确定它不存在? - OMG Ponies
1
你在打算创建表格的数据库中吗?同时,尝试运行DESCRIBE contenttype,看它是否确实存在。 - BoltClock
1
你为什么那么确定它不存在? - Fosco
11
请检查我编辑后的帖子。我并不是个白痴 :) 它绝对不存在。 - Citizen
2
在进行 WP 迁移时,我遇到了一个问题。我从生产服务器导出了 MySQL 数据库,并尝试将数据库导入到我的本地机器上,但我发现 SQL 在某些情况下会“重复”。换句话说,在同一导入文件/SQL 中,我的 SQL 尝试创建相同的表两次,即使当我刷新时它并没有显示出来。我找到了解决方法,只需复制和粘贴到第二个表不再尝试创建的位置即可。 - TARKUS
显示剩余2条评论
28个回答

92
听起来你的表格好像是薛定谔的猫...

现在认真点,你可能有一个损坏的表格。试试以下方法:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • 如果您拥有足够的权限,请删除数据文件(在/mysql/data/db_name中)

2
修复表格 contenttype 使用 USE_FRM结果为:gunzfact_vbforumdb.contenttype 修复 错误 无法打开表格 gunzfact_vbforumdb.contenttype 修复 状态 操作失败我们已经接近解决问题了,但仍未找到解决方法。我不知道表格中的数据是否必要,还有其他的修复方法吗?我也尝试运行了 myisamchk,但没有成功。 - Citizen
可以访问表格的*.myi, *.myd, *.frm文件吗? - NullUserException
@Citizen 这些是实际存储表数据和结构信息的文件。它们通常位于mysql目录中的某个位置。 - NullUserException
7
我最近也遇到了这个问题。这篇帖子帮助我解决了它。但是,在同一张表上执行DROP TABLE IF EXISTS和REPAIR TABLE操作可能会出错,因为尝试在不存在的表上进行修复。只执行DROP TABLE IF EXISTS对我有用。 - AndyG
我喜欢古老的答案仍然能够拯救生命!+1 - Mike B
显示剩余5条评论

36

来自MySQL日志:

InnoDB: You can drop the orphaned table inside InnoDB by
InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and copying the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.

1
它对我有效。但是必须为我的数据库中的所有表重复此操作。 - Darshan Thanki
1
对我没用...尽管我现在有有效的*.frm和*.ibd文件,但表仍然不存在。 - Domi
1
确保MySQL具有访问#sql-ibXXX.frm文件的权限。 - tiger.seo
天啊!即使在执行“DROP TABLE IF EXISTS”之前,我仍然无法摆脱创建表时出现的“表已存在”错误。通过创建一个具有相同名称(和虚拟列)的虚拟表,并使用.frm和.ibd文件,解决了这个问题!非常感谢。 - Andrew
我在同一数据库中创建了一个表,但名称略有不同(在末尾添加了“2”),然后将.frm文件重命名为原始表名。然后我就能够删除孤立的表了。 - Vasiliy Zverev
显示剩余3条评论

18

您可能需要清除表缓存。例如:

DROP TABLE IF EXISTS `tablename` ;
FLUSH TABLES `tablename` ; /* or exclude `tablename` to flush all tables */
CREATE TABLE `tablename` ...

1
谢谢,你救了我。我的模式出了问题(我无法删除它),所以我删除了所有文件,但仍然遇到相同的错误,直到我尝试了这个。 - Juan Antonio Orozco
不要忘记重新启动你的SQL服务。 - IRvanFauziE
对我来说工作正常! - negrotico19

16

我遇到了同样的错误,而REPAIR TABLE(来自@NullUserException答案中的)并没有起到帮助作用。

我最终找到了这个解决方案

sudo mysqladmin flush-tables

对我来说,如果没有使用sudo,我会得到以下错误:

mysqladmin: refresh failed; error: 'Access denied; you need the RELOAD privilege for this operation'

(运行在 OS X 10.6 上)


1
谢谢,sudo mysqladmin flush-tables 解决了我的问题。 - vit

5

创建视图时出现了同样的问题。

视图之前存在,但由于一些更改而被删除。但是当我试图再次添加它时,它显示“视图已经存在”的错误消息。

解决方案

您可以手动执行以下操作:

  1. 进入安装MySQL的文件夹
  2. 进入其中的data文件夹。
  3. 选择您的数据库并进入其中。
  4. 数据库创建“.frm”格式文件。
  5. 删除特定表格的文件。
  6. 现在重新创建表格。

这将成功创建表格。


4

遇到相同的问题(创建InnoDB表格),以下是最终为我解决问题的方法:

DROP DATABASE `having_issues`;

我检查了文件权限,尝试了REPAIR和FLUSH,但都没有起作用。

所以如果可以的话,将所有工作表移动到另一个数据库,删除旧的(在删除之前,您可能需要手动从数据库文件夹中删除任何文件),重新命名新的数据库,然后您应该可以继续使用了。显然,使用InnoDB缓存的任何内容都会随着原始数据库一起被删除。


1
我也尝试了这里提到的所有其他方法,但只有这个方法有效。显然,在当前MySQL版本(至少在我的WAMPP安装中),数据库缓存了一些信息,使得仅通过删除孤立的ibd文件无法修复它。刷新表、REPAIR TABLE等方法也没有起作用。 - Domi

4

你不会相信我!我刚刚从我的.sql文件中删除了一个注释块,现在它可以工作了。

CREATE DATABASE  IF NOT EXISTS `issga` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `issga`;
--
-- Table structure for table `protocolo`
--

DROP TABLE IF EXISTS protocolo;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
 CREATE TABLE protocolo (
  `idProtocolo` int(11) NOT NULL AUTO_INCREMENT,
  `tipo` varchar(30) DEFAULT NULL,
  `estado` int(2) DEFAULT 0,
  PRIMARY KEY (`idProtocolo`)
 ) ENGINE=InnoDB AUTO_INCREMENT=142 DEFAULT CHARSET=utf8;
 /*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `protocolo`
--

LOCK TABLES protocolo WRITE;
/*!40000 ALTER TABLE protocolo DISABLE KEYS */;
/* INSERT INTO `protocolo` VALUES () */
/*!40000 ALTER TABLE protocolo ENABLE KEYS */;
UNLOCK TABLES;

被删除的评论块是这样的:
--
-- Table structure for table `protocolo`
-- 

我已经在同一个 .sql 文件中保留了有问题的表。之后,我删除了注释,只留下代码,错误就消失了。


4

我在Win7中使用Sql Maestro for MySql 12.3时遇到了这个问题。这实在是非常令人恼火,实际上也会让程序无法继续进行。什么都没有帮助,甚至连删除和重新创建数据库也没用。我在XP上安装了同样的设置,那里可以正常运行。因此,在阅读你有关权限的答案后,我意识到这必须与Win7的权限相关。所以我以管理员身份运行了MySql,即使Sql Maestro是正常运行的,错误也消失了。所以这一定是Win7和MySql之间的权限问题。


4
我正在处理同样的问题。尽管表不存在,但我无法创建它。我尝试了以上所有解决方案,但都没有成功。
我的解决方法是从MySQL的数据文件夹中删除ib_logfil0ib_logfile1ibdata1auto.cnf这些文件;在删除这些文件之前,请确保先停止MySQL服务。
然后重新启动服务,MySQL会重新创建这些文件,我就能运行备份脚本了,其中包含所有我的CREATE命令(一个sqldump文件)。

这对我有用,最初删除表也很感谢 :) - RustyIngles
我有一个MySQL文件夹的完整备份(usr/local/var/mysql),重新安装mysql(brew)后,当我尝试替换备份文件夹时,我的所有旧数据库都显示不存在:(请问您能帮助我如何修复这个问题吗? - Jahirul Islam Mamun

4
我整天都在解决这个问题:我有一个Perl脚本,通过首先对它们执行“DROP IF EXISTS ...”,然后再创建它们来构建一组表格。尽管“DROP”成功了,但是在“CREATE”时我收到了这个错误消息:“table already exists”。
最终我解决了这个问题:我正在使用的新版本MySQL具有默认的InnoDB引擎(“show engine \G;”)。我在my.cnf文件中将其更改为MyISAM,默认重启MySQL后,“table already exists”错误不再出现。

对我没用。将全局MySQL引擎从InnoDB更改为MyISAM - 对于存在/不存在相同的问题。MySQL服务器运行在Windows 2003上。 - Paktas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接