Mysql 1050错误“表已经存在”,实际上它没有

时间:2010-07-21 18:22:22

标签: mysql sql mysql-error-1146 mysql-error-1050

我正在添加此表:

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“桌子已经存在”

但该表不存在。有什么想法吗?

编辑:更多细节,因为每个人似乎都不相信我:)。

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'已存在

25 个答案:

答案 0 :(得分:64)

听起来你有Schroedinger's table ...

说真的,你可能有一张破桌子。尝试:

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

答案 1 :(得分:30)

来自MySQL Log的

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.

答案 2 :(得分:14)

我得到了同样的错误,并且REPAIR TABLE(来自@ NullUserException的答案)没有帮助。

我最终找到this solution

sudo mysqladmin flush-tables

对我来说,如果没有sudo,我收到以下错误:

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

(在OS X 10.6上运行)

答案 3 :(得分:11)

您可能需要刷新表缓存。例如:

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

答案 4 :(得分:4)

遇到同样的问题(创建InnoDB表)这最终对我有用:

DROP DATABASE `having_issues`;

我检查了文件,权限,尝试了REPAIR和FLUSH但没有任何效果。

因此,如果这是一个选项,请将所有工作表移动到另一个DATABASE,删除旧的(您可能必须在删除之前手动删除数据库文件夹中的任何文件),重命名新的,你应该回到路上。显然,使用InnoDB进行“缓存”的任何内容都会与原始数据库一起删除。

答案 5 :(得分:4)

我一整天都在为此而奋斗:我有一个Perl脚本,通过首先对它们DROP IF EXISTS ...进行构建,然后CREATE来构建一组表。 DROP成功,但在CREATE我收到此错误消息:table already exists

我终于找到了它的底部:我正在使用的新版MySQL具有InnoDB的默认引擎(“show engine \ G;”)我在my.cnf文件中将其更改为默认为MyISAM ,重新启动MySQL,现在我不再得到“表已存在”错误。

答案 6 :(得分:3)

我也遇到过这个问题,试图创建一个表说它已经存在并且删除表说它不存在。

我做了“FLUSH TABLES”,它解决了这个问题。

答案 7 :(得分:3)

创建视图时,我遇到了同样的问题。 之前的视图由于一些更改而被删除但是当我尝试再次添加它时它显示“view already exists”错误消息。

解决方案

你可以手动做一件事。

  1. 转到已安装它的MySQL文件夹
  2. 转到其中的数据文件夹。
  3. 选择您的数据库并进入其中。
  4. 数据库创建“.frm”格式文件。
  5. 删除特定表格的文件。
  6. 现在再次创建表格。
  7. 它将成功创建表。

答案 8 :(得分:3)

我在Sql Maestro for MySql 12.3的Win7上遇到了这个问题。非常刺激,实际上是一个表演塞子。什么都没有帮助,甚至没有删除和重新创建数据库。我在XP上有相同的设置,它在那里工作,所以在阅读了关于权限的答案后,我意识到它必须与Win7权限相关。所以我以管理员身份运行MySql,即使Sql Maestro运行正常,错误也消失了。所以它一定是Win7和MySql之间的权限问题。

答案 9 :(得分:2)

首先检查您是否在正确的数据库USE yourDB中并尝试Select * from contenttype只是为了查看它是什么以及它是否确实存在...

答案 10 :(得分:2)

我有同样的情况。该问题最终成为父目录的权限。

我在测试期间一直在将文件复制到mysql中。

drwx------   3 _mysql  wheel 

还不够,需要:

-rw-rw----   3 _mysql  wheel 

抱歉复活。

答案 11 :(得分:2)

我在Mac OS X和MySQL 5.1.40遇到了同样的问题。我使用eclipse编辑我的SQL脚本,而不是尝试MySQLWorkbench 5.2.28。可能它将换行符转换为Mac格式。在我注释掉文件中的第一行之前,我根本不知道我的脚本有什么问题。在此之后,mysql将此脚本解释为单个注释。我使用内置的TextEdit Mac应用程序来解决这个问题。在换行符转换为正确的格式后,错误1050消失了。

Eclipse用户更新:

在整个工作区中设置新文件的默认结尾:

  

窗口 - >偏好 - >一般 - >   工作区 - >新文本文件行   分隔符。

要转换现有文件,打开文件进行编辑以及当前编辑的文件,请转到菜单:

  

档案 - >将行分隔符转换为

答案 12 :(得分:2)

我正在努力解决同样的问题。即使它不存在,我也无法创建表。我尝试了以上所有解决方案都没有成功。

我的解决方案是从MySQL的数据文件夹中删除文件ib_logfil0ib_logfile1ibdata1auto.cnf;确保在删除这些文件之前先停止MySQL服务。

然后在重新启动服务之后,MySQL重新创建了这些文件,并且我能够运行备份脚本,所有CREATE都被存储(sqldump文件)。

答案 13 :(得分:1)

如果数据库中的“view”(虚构表)与我们的新表名同名,也会出现此问题。

答案 14 :(得分:1)

在我的情况下,我发现这是InnoDB的一个问题;我从来没有发现实际问题是什么,但是作为MyISAM创建允许它构建

答案 15 :(得分:1)

我遇到了同样的问题,看起来数据库名称区分大小写。我的数据库被称为:

Mydatabase

虽然我的剧本包括

USE mydatabase

一旦我将数据库名称更改为正确的案例,一切似乎都有效。在MAC OSX上使用MYSQL Workbench

答案 16 :(得分:1)

你不会相信我!我刚从.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文件中。之后我删除了评论,剩下唯一的代码,错误就消失了。

答案 17 :(得分:1)

我的CREATE语句是staging env dump的一部分。

我确实尝试了上面提到的所有内容。我没有得到解决方案。然而,我的救赎之路是:

  1. 我偶然发现,当我纠正数据库名称区分大小写时,CREATE语句确实通过了(其中一个)。这点击了一下。我对其他表重复了同样的事情。

  2. 然而,一个新的错误进入了场景。 “评论”的直引号引发了语法错误。我感到震惊。替换它们但新错误开始出现。最后我知道解决方案。

  3. 解决方案:我正在使用的转储可能来自不同版本的MySql。我获得了使用本地(安装在我的机器上)mysql工作台连接到暂存MYsql的权限。我没有进入登台服务器登录到staging mysql workbench。从那里创建了一个转储。跑到垃圾场,它就像甜蜜一样。

答案 18 :(得分:1)

对我来说,问题是在使用mysql数据库目录的文件系统副本而不是mysqldump时引起的。我有一些非常大的表,主要是MyISAM和一些InnoDB缓存表,并且mysqldump数据是不实际的。由于我们仍在运行MyISAM,因此XtraBackup不是一个选项。

我发生了与上述相同的症状。该表不存在,目录中没有与该表相关的文件,但由于MySQL认为它存在,因此无法创建。 Drop table表示它不存在,create table表示它已经存在。

两台计算机上出现问题,两者都是通过复制备份修复的。但是,我注意到在我的备份中有一个.MYD和.MYI文件,即使我的印象是这些文件不用于InnoDB。 .MYD和.MYI文件拥有root用户,而.frm拥有mysql。

如果从备份进行复制,请检查文件权限。刷新表可能有效,但我选择关闭并重新启动数据库。

祝你好运。

答案 19 :(得分:1)

天哪,我在使用osCommerce安装脚本时遇到了同样的问题,直到我发现mysql系统有很多数据库并且create table查询将自身复制到每个数据库中,因此只丢弃工作表db没有帮助,我不得不从所有dbs中删除表格

答案 20 :(得分:1)

尝试导入备份sql文件但是收到错误; 1050"表已经存在"

我的设置是:

  • Windows 7
  • Mysql 5.5.16

解决方案:

  1. 将服务器引擎从InnoDB更改为MyISAM
  2. 使用phpMyAdmin删除了我尝试导入的数据库
  3. 重新启动mysql服务
  4. 尝试重新输入并且有效

答案 21 :(得分:1)

我遇到了错误1050和150的巨大问题。

对我而言,问题是我试图添加ON DELETE SET NULL约束作为条件之一。

更改为ON DELETE NO ACTION允许我添加所需的FK约束。

不幸的是,MySql错误消息完全没有用,所以我必须在上述问题的答案的帮助下迭代地找到这个解决方案。

答案 22 :(得分:1)

在我的情况下,问题是有一个与我的表同名的视图,所以我不得不放弃视图以允许导入继续。

drop view `my-view-that-has-same-name-as-table`;

对我有用的自动解决方案是在转储期间使用此sed替换普通的drop table,同时删除可能存在的任何视图:

mysqldump my-db \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
| mysql my-other-db

或者您更愿意打印到文件进行备份

mysqldump my-db \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
> my-db.dump.sql

或者如果您收到转储文件并将其导入数据库

cat my-db.dump.sql \
| sed -E 's/^DROP TABLE IF EXISTS(.+)$/\0 DROP VIEW IF EXISTS\1/g' \
| mysql my-other-db

你明白了

注意:在替换正则表达式的开头添加^非常重要,因为转储中还有其他类型的DROP TABLE IF EXISTS命令,您不想触及它们。

你有这样的事情:

--
-- Table structure for table `my_table`
--

DROP TABLE IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
...

有这样的事情:

--
-- Table structure for table `my_table`
--

DROP TABLE IF EXISTS `my_table`; DROP VIEW IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
...

答案 23 :(得分:1)

我刚刚遇到了相同的错误,但是我知道该表已经存在,并且想要添加到该表中。我要添加我的答案,因为在寻找相同错误但情况稍有不同时,此问题在Google上对我来说排名第一。基本上我需要打勾

“添加DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER语句”

这为我解决了错误。

答案 24 :(得分:0)

您的磁盘也可能已满。 (就是这样)