【问题标题】:Mysql 1050 Error "Table already exists" when in fact, it does notMysql 1050 错误“表已存在”,实际上它不存在
【发布时间】:2011-03-19 03:57:15
【问题描述】:

我正在添加这张表:

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

【问题讨论】:

  • 如何确定它不存在?
  • 您是否在打算在其中创建表的数据库中?另外,尝试运行DESCRIBE contenttype 看看它是否确实存在。
  • 是什么让你如此确定它不存在?
  • 查看我编辑的帖子。我不是白痴:)它绝对不存在。
  • 在 WP 迁移遇到这个问题后,我从生产服务器导出 MySQL 数据库,并尝试在本地机器上导入数据库,我发现 SQL 在由于某种原因,我的数据库导出 sql。所以,换句话说,我的 sql 试图在同一个导入文件/SQL 中创建同一个表两次,即使当我刷新它时它没有显示出来。我想只复制和粘贴到第二个表没有被创建的地方。

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


【解决方案1】:

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

在创建转储时添加single transaction 可解决问题。

【讨论】:

    【解决方案2】:

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

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

    这为我解决了错误。

    【讨论】:

    • 您的意思是“需要勾选”权限吗?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        DROP DATABASE `having_issues`;
        

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

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

        【讨论】:

        • 我还研究了我在这里看到的所有其他想法,但这是唯一可行的。显然,当前 MySQL 版本(至少在我的 WAMPP 安装中)中的数据库缓存了一些信息,因此无法通过删除孤立的 ibd 文件来修复它。刷新表、修复表等也不起作用。
        【解决方案6】:

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

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

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

        【讨论】:

        • 这对我有用,并且最初删除了表格。谢谢:)
        • 我有 MySQL 文件夹 (usr/local/var/mysql) 的完整备份,在重新安装 mysql (brew) 后,当我尝试替换该备份文件夹时,我的旧所有数据库显示不存在: (你能帮我解决这个问题吗?
        【解决方案7】:

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

        【讨论】:

        • 我不知道为什么有人反对你。我很高兴看到更多关于其他内容的回复,这些回复可能是针对在 Google 上找到此内容的人。
        【解决方案8】:

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

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

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

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

        【讨论】:

          【解决方案9】:

          正在尝试导入备份 sql 文件但出现错误; 1050 "表已经存在"

          我的设置是:

          • Windows 7
          • Mysql 5.5.16

          解决方案:

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

          【讨论】:

            【解决方案10】:

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

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

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

            2. 然而,出现了一个新错误。 'cmets' 的直引号引发语法错误。我很震惊。替换了它们,但新的错误开始出现。终于知道解决办法了。

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

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

                解决方案

                你可以手动做一件事。

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

                它会成功创建表。

                【讨论】:

                  【解决方案13】:

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

                  与上述相同的症状也发生在我身上。该表不存在,目录中没有与该表相关的文件,但无法创建它,因为 MySQL 认为它在那里。 Drop table 说它不存在,create table 说它存在。

                  问题发生在两台机器上,均通过复制备份解决。但是,我注意到在我的备份中有一个 .MYD 和 .MYI 文件,尽管我的印象是这些文件不用于 InnoDB。 .MYD 和 .MYI 文件的所有者为 root,而 .frm 的所有者为 mysql。

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

                  祝你好运。

                  【讨论】:

                    【解决方案14】:

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

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

                    【讨论】:

                      【解决方案15】:

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

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

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

                      【讨论】:

                      • > REPAIR TABLE contenttype USE_FRM 产生 gunzfact_vbforumdb.contenttype repair 错误 Can't open table gunzfact_vbforumdb.contenttype repair status 操作失败 所以我们越来越近了,但仍然没有解决方案。我不知道表中的数据是否需要,有没有其他方法可以修复它?我跑了一个 myisamchk 也没有运气。
                      • 可以访问表的 *.myi、*.myd、*.frm 文件吗?
                      • @Citizen 这些是存储表数据和结构信息的实际文件。它们通常位于 mysql 目录中的某个位置。
                      • 只是提醒其他人,桌子确实存在,但完全无聊。什么都检测不到,但我可以放下桌子。
                      • 我最近也遇到了这个问题。这个帖子帮我解决了。但是,在同一个表上执行 DROP TABLE IF EXISTS 后跟 REPAIR TABLE 会导致错误,因为在不存在的表上调用修复。只有在存在时才做 DROP TABLE 似乎对我有用。
                      【解决方案16】:

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

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

                      【讨论】:

                      • 对我不起作用。将全局 MySQL 引擎从 InnoDB 更改为 MyISAM - 存在/不存在的相同问题。在 Windows 2003 上运行的 MySQL 服务器。
                      【解决方案17】:

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

                      【讨论】:

                      • 作为对 jmadsen 的回应(可能有点晚......)我遇到了同样的问题,原因是表是在 InnoDB 存储中创建的,而对应的 .frm 文件在 MySQL 之外被删除.所以我从备份中恢复了 .frm 文件,我能够修复/删除/重新创建表。问候,罗兰·勒尔斯
                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

                        来自 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.
                        

                        【讨论】:

                        • 它对我有用。但是必须对我数据库中的所有表重复。
                        • 是的,看起来这可能是由于使用 ALTER TABLE ** 引擎 MyISAM 将 InnoDB 表更改为 MyISAM 造成的。 mysqlhotcopy 可能也参与了创建我的问题,因为它不适用于 InnoDB 表,并且当我第一次执行该命令时,这个表可能仍然是 InnoDB。
                        • 对我不起作用...即使我现在有有效的 *.frm 和 *.ibd 文件,表仍然不存在。
                        • 确保mysql对#sql-ibXXX.frm文件有权限
                        • 非常感谢...从来没有从日志中得到这个,但它确实有效。
                        【解决方案20】:

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

                        【讨论】:

                          【解决方案21】:

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

                          Mydatabase
                          

                          虽然包含我的脚本

                          USE mydatabase
                          

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

                          【讨论】:

                            【解决方案22】:

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

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

                            drwx------   3 _mysql  wheel 
                            

                            还不够,需要:

                            -rw-rw----   3 _mysql  wheel 
                            

                            抱歉复活了。

                            【讨论】:

                              【解决方案23】:

                              我遇到了同样的错误,而 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 上运行)

                              【讨论】:

                              • 谢谢,sudo mysqladmin flush-tables 为我解决了这个问题。
                              【解决方案24】:

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

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

                              【讨论】:

                              • 谢谢,你救了我,我的架构是如何损坏的(我不能放弃它)所以我删除了所有文件,但一直收到同样的错误,直到我尝试这个
                              • 别忘了重启你的 SQL 服务。
                              • 为我工作!
                              【解决方案25】:

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

                              Eclipse 用户更新:

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

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

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

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

                              【讨论】:

                                【解决方案26】:

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

                                【讨论】:

                                  猜你喜欢
                                  • 2010-12-11
                                  • 2014-07-31
                                  • 2011-05-14
                                  • 2018-02-18
                                  • 2018-08-26
                                  • 2019-09-10
                                  • 1970-01-01
                                  • 2020-05-16
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多