Mysql 1050错误“表已存在”实际上不存在


74

我要添加此表:

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


5
您如何确定它尚不存在?
OMG Ponies,2010年

1
您是否打算在数据库中创建表?另外,尝试运行DESCRIBE contenttype并查看它是否确实存在。
BoltClock

1
是什么让您确定它不存在?
Fosco 2010年

8
检查我编辑的帖子。我不是白痴:)绝对不存在。
公民2010年

2
在经历了WP迁移的问题之后,我从生产服务器中导出MySQL数据库,并尝试在本地计算机上导入db,然后我发现由于某种原因,SQL已在db导出sql中“加倍”了。因此,换句话说,我的sql试图在同一导入文件/ SQL中创建同一张表两次,即使刷新时也没有出现。我想出只复制和粘贴到不尝试创建第二张表的地方。
TARKUS

Answers:


77

听起来好像您有薛定ed的桌子...

严重的是,您的表可能已损坏。尝试:

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

2
>修复表contenttype USE_FRM会产生gunzfact_vbforumdb.contenttype修复错误错误无法打开表gunzfact_vbforumdb.contenttype修复状态操作失败因此,我们越来越近,但仍然没有解决方案。我不知道表中的数据是否必要,是否还有其他方法可以修复它?我也没有运气就跑了myisamchk。
公民2010年

可以访问表的* .myi,*。myd,*。frm文件吗?
NullUserException 2010年

@Citizen这些是存储表数据和结构信息的实际文件。它们通常位于mysql目录中。
NullUserException 2010年

只是直言不讳,桌子确实存在,但完全令人厌烦。没有任何东西可以检测到它,但是我可以放下桌子。
公民2010年

6
我最近也有这个问题。这篇文章帮助我解决了这个问题。但是,由于在不存在的表上调用了修复,因此在同一表上执行DROP TABLE IF EXISTS后再执行REPAIR TABLE会导致错误。如果存在,仅执行DROP TABLE对我似乎有效。
2011年

34

从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

是的,这可能是由于使用ALTER TABLE **引擎MyISAM将InnoDB表更改为MyISAM引起的。mysqlhotcopy也可能与我的问题有关,因为它不适用于InnoDB表,而当我第一次执行命令时,这个问题可能仍然是InnoDB。
深冬

1
不适用于我...即使我现在具有有效的* .frm和* .ibd文件,表仍然不存在。
2014年

1
确保mysql拥有对#sql-ibXXX.frm文件的权限
tiger.seo 2014年

非常感谢...从未从日志中获得此信息,但它确实有效。
Pierre

14

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

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

1
谢谢,您救救我,我的模式如何崩溃(我不能将其删除),因此我删除了所有文件,但一直收到相同的错误,直到我尝试执行此操作
Juan Antonio Orozco 2013年

不要忘记重新启动SQL服务。
IRvanFauziE 2014年

为我工作!
negrotico19 '19

14

我遇到了同样的错误,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

4

我整天都在为此而战:我有一个Perl脚本,该脚本首先DROP IF EXISTS ...对它们进行CREATE处理然后对其进行构建,从而构建了一组表。的DROP成功,但在CREATE我得到这个错误信息: table already exists

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


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

4

创建视图时,我也遇到了同样的问题。该视图早些时候就存在,由于某些更改而被删除了,但是当我再次尝试添加它时,它向我显示“视图已存在”错误消息。

解决方案

您可以手动执行一件事。

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

它将成功创建表。


4

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

DROP DATABASE `having_issues`;

我检查了文件权限,尝试修复和刷新,但没有任何效果。

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


1
我还研究了我在这里看到的所有其他想法,但这是唯一可行的想法。显然,当前MySQL版本(至少在我的WAMPP安装中)中的数据库已缓存了一些信息,这使得仅通过删除孤立的ibd文件就无法修复它。刷新表,修复表等也不起作用。
米(Domi)2014年

3

我在Win7中的MyMastro Sql Maestro 12.3中有此问题。极大地令人讨厌,实际上是个表演塞子。没有任何帮助,甚至没有删除并重新创建数据库。我在XP上具有相同的设置,并且可以在其中运行,因此在阅读有关权限的答案后,我意识到它必须与Win7权限相关。因此,我以管理员身份运行MySql,即使Sql Maestro正常运行,该错误也消失了。因此,它一定是Win7和MySql之间的权限问题。


3

在尝试创建表时说它已经存在,而在删除表时说它不存在,我也遇到了这个问题。

我做了“冲洗表”,它清除了问题。


3

我在同一个问题上挣扎。即使它不存在,也无法创建表。我尝试了上述所有解决方案,但均未成功。

我的解决办法是删除文件ib_logfil0ib_logfile1ibdata1,并auto.cnf从MySQL的数据文件夹; 确保删除这些文件之前先停止MySQL服务。

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


这对我来说很奏效,并且一开始就丢下桌子。谢谢:)
RustyIngles 16-10-4

我有一个MySQL文件夹的完整备份(usr / local / var / mysql),重新安装mysql(brew)后,当我尝试替换该备份文件夹时,我的所有旧数据库显示不存在:(您能帮我怎样我解决了吗?
Jahirul Islam Mamun

2

首先检查您是否在正确的数据库中,USE yourDB然后尝试Select * from contenttype看看它是什么以及它是否确实存在。


2

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

Eclipse用户更新:

要在整个工作空间中为创建的新文件设置默认结尾,请执行以下操作:

窗口->首选项->常规->工作区->新文本文件行定界符。

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

文件->将行定界符转换为


2

我有同样的情况。问题最终是对父目录的权限。

在测试期间,我一直在将文件复制进出mysql。

drwx------   3 _mysql  wheel 

还不够,必须是:

-rw-rw----   3 _mysql  wheel 

抱歉复活。


2

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

问题是,对我来说,我试图添加一个约束 ON DELETE SET NULL之一的。

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

不幸的是,MySql错误消息根本无济于事,因此我不得不迭代地找到这种解决方案,并借助于上述问题的答案。


1

我遇到了同样的问题,数据库名称似乎区分大小写。我的数据库称为:

Mydatabase

虽然我的脚本包括

USE mydatabase

一旦将数据库名称更改为正确的大小写,一切似乎都可以正常工作。在MAC OSX上使用MYSQL Workbench


1

如果数据库中存在与新表名相同名称的“视图”(虚表),也会发生此问题。


1

就我而言,我发现这是InnoDB的问题。我从来没有发现真正的问题是什么,但是创建为MyISAM使其得以构建


作为对jmadsen的回应(可能有点晚了……),我遇到了同样的问题,原因是该表是在InnoDB存储中创建的,而对应的.frm文件已在MySQL外部删除。因此,我从备份中还原了.frm文件,并且能够修复/删除/重新创建表。此致Roland Leurs
Roland Leurs 2013年

1

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

我发生了与上述相同的症状。该表不存在,目录中没有与该表相关的文件,但由于MySQL认为存在该表而无法创建。删除表说不存在,创建表说不存在。

该问题发生在两台计算机上,都通过复制备份得以解决。但是,我注意到在备份中有一个.MYD和.MYI文件,即使我印象中这些文件未用于InnoDB。.MYD和.MYI文件具有root所有者,而.frm由mysql拥有。

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

祝好运。


1

天哪,我在osCommerce安装脚本时遇到了同样的问题,直到我发现mysql系统有很多数据库并且create table查询将自身复制到每个数据库中,因此仅将活动表放在活动数据库上并没有帮助,我不得不从所有数据库中删除该表


1

我的CREATE语句是暂存环境转储的一部分。

我确实尝试了上面提到的所有内容。我没有得到解决方案。但是,我的兑换途径是:

  1. 我偶然发现了以下事实:纠正数据库名称区分大小写时,CREATE语句(确实有很多)确实通过了。这点击了一些东西。我对其他表重复了相同的操作。

  2. 但是,新的错误出现了。“注释”的直接引号引发语法错误。我感到震惊。替换了它们,但是新的错误开始弹出。终于我知道了解决方案。

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


1

试图导入备份sql文件,但出现错误;1050“表已存在”

我的设置是:

  • Windows 7的
  • 的MySQL 5.5.16

解:

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

1

您的磁盘可能也已满。(刚刚)


我不知道为什么有人拒绝了你。很高兴看到其他人的更多回应,可能是有人在Google上找到答案。
公民

1

在我的情况下,问题在于存在一个与表名称相同的视图,因此我不得不删除该视图以允许继续导入。

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

一个对我有用的自动化解决方案是在转储期间用此sed替换普通的删除表,以删除所有可能存在的视图:

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` (
...

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文件中。之后,我删除了注释,只剩下了代码,错误消失了。


1

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

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

这为我解决了错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.