Mysql 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'已经存在
听起来像你有Schroedinger的桌子 …
现在严重,你可能有一张破桌子。 尝试:
-
DROP TABLE IF EXISTS contenttype
-
REPAIR TABLE contenttype
- 如果您拥有足够的权限,请删除数据文件(在/ mysql / data / db_name中)
从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.
我得到了同样的错误,REPAIR TABLE(来自@NullUserException的答案)没有帮助。
我最终发现这个解决scheme :
sudo mysqladmin flush-tables
对于我来说,没有sudo
,我得到了以下错误:
mysqladmin: refresh failed; error: 'Access denied; you need the RELOAD privilege for this operation'
(在OS X 10.6上运行)
您可能需要刷新表caching。 例如:
DROP TABLE IF EXISTS `tablename` ; FLUSH TABLES `tablename` ; /* or exclude `tablename` to flush all tables */ CREATE TABLE `tablename` ...
我一整天都在为此奋斗:我有一个Perl脚本,先build立一个表,然后CREATE
一个DROP IF EXISTS ...
然后CREATE
它们。 DROP
成功了,但在CREATE
我得到了这个错误信息: table already exists
我终于明白了:我使用的MySQL的新版本有一个默认引擎InnoDB(“show engine \ G;”)。我在my.cnf文件中将其更改为默认为MyISAM,开始MySQL,现在我不再得到“表已经存在”的错误。
遇到同样的问题(创buildInnoDB表)这是最后为我工作的:
DROP DATABASE `having_issues`;
我检查了一个文件的基础上,权限,试图维修和刷新,但没有任何工作。
所以,如果这是一个选项,将所有工作表移动到另一个DATABASE,删除旧的(您可能必须手动删除数据库文件夹中的任何文件才能工作) ,重新命名新的,你应该回来的路上。 显然,无论使用InnoDB“caching”,都会丢弃原始数据库。
我在MySql 12.3的Sql Maestro的Win7上遇到了这个问题。 实际上非常刺激,显示塞子。 没有什么帮助,甚至没有删除和重新创build数据库。 我在XP上有这个相同的设置,它在那里工作,所以在阅读关于权限的答案后,我意识到它必须与Win7权限相关。 所以我以pipe理员身份运行MySql,即使Sql Maestro运行正常,错误消失了。 所以它一定是Win7和MySql之间的权限问题。
我也遇到了这个问题,试图创build一个表,表示它已经存在,并且表中表示不存在。
我做了“FLUSH TABLES”并清除了问题。
创build视图时出现同样的问题。 该视图出现之前,由于一些变化,它被删除了但是当我试图再次添加它显示“视图已经存在”错误消息。
解答 :
你可以手动做一件事。
- 转到您安装它的MySQL文件夹
- 转到它里面的数据文件夹。
- select你的数据库,并进入它。
- 数据库创build“.frm”格式的文件。
- 删除特定表格的文件。
- 现在再次创build表。
它会成功创build表。
首先检查你是否在正确的数据库USE yourDB
你的数据库,并尝试Select * from contenttype
只是为了看看它是什么,如果它确实存在…
我在Mac OS X和MySQL 5.1.40有同样的问题。 我用eclipse编辑我的SQL脚本,比我试过MySQLWorkbench 5.2.28。 可能它将换行符转换为Mac格式。 我不知道我的脚本有什么问题,直到我将文件中的第一行注释掉了。 在这之后,这个脚本被mysql解释为一个单一的注释。 我使用内置的TextEdit Mac应用程序来解决这个问题。 换行符被转换为正确的格式后,错误1050消失了。
Eclipse用户的更新:
要在整个工作区中设置创build的新文件的默认结尾,请执行以下操作:
窗口 – >首选项 – >常规 – >工作区 – >新build文本文件行分隔符。
要转换现有文件,请打开要编辑的文件以及当前编辑的文件,请转到菜单:
文件 – >换行符分隔符到
我也有同样的情况。 问题最终成为父目录的权限。
在testing过程中,我一直在复制文件进出mysql。
drwx------ 3 _mysql wheel
还不够,需要做到:
-rw-rw---- 3 _mysql wheel
抱歉复活。
我有这个相同的问题,它看起来像数据库名称区分大小写。 我的数据库被称为:
Mydatabase
虽然我的脚本包括在内
USE mydatabase
一旦我将数据库名称更改为正确的大小写,这一切似乎都奏效了。 在MAC OSX上使用MYSQL Workbench
如果数据库中存在“视图”(假想表)与我们的新表名称相同的名称也会发生此问题。
就我而言,我发现这是InnoDB的一个问题。 我从来没有发现实际的问题,但创build一个MyISAM允许它build立
你不相信我! 我只是从我的.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文件中。 之后,我删除了评论,只剩下代码,错误消失了。
对我来说,这个问题是由于使用mysql数据库目录的文件系统副本而不是mysqldump造成的。 我有一些非常大的表,主要是MyISAM和一些InnoDBcaching表,这是不实际的mysqldump数据。 由于我们仍在运行MyISAM,XtraBackup不是一个选项。
上面同样的症状发生在我身上。 该表不存在,目录中没有与该表相关的文件,但是由于MySQL认为它存在,所以无法创build该文件。 Drop表示它不在那里,创build表格就是这样。
问题发生在两台机器上,两者都通过复制备份来修复。 不过,我注意到,在我的备份中,有一个.MYD和.MYI文件,尽pipe我觉得这些文件不是用于InnoDB的。 .MYD和.MYI文件拥有root的所有者,而.frm是由mysql拥有的。
如果从备份复制,请检查文件权限。 刷新表可能工作,但我selectclosures并重新启动数据库。
祝你好运。
天哪,我有同样的问题与osCommerce
安装脚本,直到我想出了MySQL系统有很多数据库和create table
查询复制到每一个,因此只有工作表上活动分贝没有帮助,我不得不放弃表来自所有的dbs
我的CREATE语句是分段env转储的一部分。
我确实尝试了上面提到的一切。 我没有得到解决scheme。 然而我的救赎之路是:
-
当我纠正数据库名称区分大小写时,我偶然发现(CREATE语句中的许多内容之一)通过了这一事实。 这点击了一些东西。 我重复了其他表格。
-
然而,一个新的错误进入现场。 直接引用“注释”是抛出语法错误。 我很震惊。 取代他们,但新的错误开始popup。 最后我知道解决scheme。
解决scheme:我使用的转储可能来自不同版本的MySql。 我有权限使用本地(安装在我的机器上)mysql工作台连接到登台MYsql。 我没有进入登台服务器login到登台mysql工作台。 从那里创build了一个转储。 跑到垃圾场,它像一个甜蜜的工作。
试图导入一个备份的SQL文件,但得到错误; 1050“表已经存在”
我的设置是:
- Windows 7的
- Mysql 5.5.16
解:
- 将InnoDB服务器引擎更改为MyISAM
- 使用phpMyAdmin删除我试图导入到的数据库
- 重新启动mysql服务
- 试图重新input,它的工作
我遇到了错误1050和150的大问题。
问题,对我来说,我试图添加ON DELETE SET NULL
作为条件之一的约束。
更改为ON DELETE NO ACTION
允许我添加所需的FK约束。
不幸的是,MySql错误消息是完全无益的,所以我不得不迭代find这个解决scheme,并在上面的问题的答案帮助。
我正在同样的问题挣扎。 我不能创build一个表,即使它不存在。 我尝试了所有上述解决scheme,但都没有成功。
我的解决scheme是从MySQL的数据文件夹中删除文件ib_logfil0
, ib_logfile1
, ibdata1
和auto.cnf
; 确保在删除这些文件之前先停止MySQL服务。
然后,重新启动服务后,MySQL重新创build这些文件,我能够运行一个备份脚本是所有我的CREATE
被存储(sqldump文件)。
在我的情况下,问题是有一个与我的表同名的视图,所以我不得不放弃视图,以允许导入继续。
drop view `my-view-that-has-same-name-as-table`;
为我工作的自动化解决scheme是在转储过程中用此sedreplace普通的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
你明白了
注意:在replace正则expression式开始处添加^
是非常重要的,因为在转储中还有其他types的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` ( ...
您的磁盘也可能已满。 (刚刚有)