80

我正在添加此表:

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 - 表“内容类型”已存在

4

26 回答 26

84

听起来你有薛定谔的桌子......

现在说真的,你可能有一张坏了的桌子。尝试:

  • DROP TABLE IF EXISTS contenttype
  • REPAIR TABLE contenttype
  • 如果您有足够的权限,请删除数据文件(在 /mysql/data/db_name 中)
于 2010-07-21T19:07:31.990 回答
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.
于 2012-08-23T07:31:52.720 回答
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 上运行)

于 2010-11-23T00:00:57.383 回答
15

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

DROP TABLE IF EXISTS `tablename` ;
FLUSH TABLES `tablename` ; /* or exclude `tablename` to flush all tables */
CREATE TABLE `tablename` ...
于 2010-11-21T17:48:22.543 回答
5

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

解决方案

你可以手动做一件事。

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

它将成功创建表。

于 2013-12-23T12:55:34.153 回答
4

我整天都在与这个作斗争:我有一个 Perl 脚本,它通过首先DROP IF EXISTS ...对它们执行 a 然后CREATEing 来构建一组表。DROP成功了,但是CREATE我收到了这个错误信息 :table already exists

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

于 2012-10-16T20:22:10.607 回答
4

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

DROP DATABASE `having_issues`;

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

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

于 2013-06-01T11:44:02.753 回答
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 文件中。之后我删除了评论,只剩下了唯一的代码,错误消失了。

于 2013-07-19T11:08:06.977 回答
3

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

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

于 2013-05-27T18:29:31.393 回答
3

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

于 2012-09-15T12:05:44.257 回答
3

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

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

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

于 2015-09-03T22:08:23.173 回答
2

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

于 2010-07-21T18:29:19.547 回答
2

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

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

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

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

于 2014-08-19T11:12:41.923 回答
2

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

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

drwx------   3 _mysql  wheel 

还不够,需要:

-rw-rw----   3 _mysql  wheel 

抱歉复活了。

于 2012-04-23T05:06:19.783 回答
2

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

Eclipse 用户更新:

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

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

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

文件 -> 将行分隔符转换为

于 2010-10-25T07:18:54.140 回答
2

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

于 2015-07-10T06:03:09.340 回答
1

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

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

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

  2. 然而,一个新的错误出现了。'comments' 的直引号引发语法错误。我惊呆了。替换了它们,但新的错误开始出现。最后我知道了解决方案。

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

于 2013-07-31T14:38:01.670 回答
1

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

我的设置是:

  • Windows 7的
  • mysql 5.5.16

解决方案:

  1. 将服务器引擎从 InnoDB 更改为 MyISAM
  2. 使用 phpMyAdmin 删除了我试图导入的数据库
  3. 重启了mysql服务
  4. 尝试重新导入并且它有效
于 2014-08-13T07:02:15.503 回答
1

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

Mydatabase

虽然我的脚本包括

USE mydatabase

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

于 2012-08-10T10:44:02.927 回答
1

如果数据库中存在与我们的新表名相同的“视图”(假想表),也会出现此问题。

于 2012-08-22T06:54:50.557 回答
1

就我而言,我发现这是 InnoDB 的一个问题;我从来没有发现真正的问题是什么,但是创建为 MyISAM 允许它构建

于 2012-10-06T00:34:13.593 回答
1

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

于 2014-04-30T09:23:25.990 回答
1

For me the problem was caused when using a filesystem copy of the mysql database directory instead of mysqldump. I have some very large tables, mostly MyISAM and a few InnoDB cache tables and it is not practical to mysqldump the data. Since we are still running MyISAM, XtraBackup is not an option.

The same symptoms as above happened to me. The table is not there, there are no files in the directory that pertain to the table, yet it cannot be created because MySQL thinks its there. Drop table says it's not there, create table says it is.

The problem occurred on two machines, both were fixed by copying backups. However, I noticed that in my backup that there was a .MYD and .MYI file, even though I was under the impression that these files are not used for InnoDB. The .MYD and .MYI files had an owner of root, while the .frm was owned by mysql.

If you copy from backup, check the file permissions. Flush tables might work, but I opted to shut down and restart the database.

Good luck.

于 2013-08-12T14:20:32.753 回答
1

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

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

这为我解决了错误。

于 2019-05-08T20:39:40.670 回答
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` (
...
于 2017-06-21T21:45:17.897 回答
0

我在新的空数据库上为 Magento 电子商务导入 .sql 转储时遇到了同样的错误。我已经尝试了上面的一些解决方案,但都没有奏效,我已经解决了改变转储创建方式的问题。

创建转储时添加单个事务解决了该问题。

于 2022-01-18T14:24:19.387 回答