【问题标题】:Error 156: table already exists when adding a primary key错误 156:添加主键时表已存在
【发布时间】:2013-08-25 12:48:22
【问题描述】:

我正在使用以下语句 ALTER TABLE my_tbl ADD PRIMARY KEY (id ); 向现有 MySQL 表添加主键。作为回复,我收到了错误:

错误 156:表 'db_name.my_tbl#1' 已存在。

我检查了该表并没有重复的 id 条目,如果我执行DROP TABLE my_tbl#1 之类的操作,则删除原始表 (my_tbl)。有趣的是,my_tbl 是由 Create Table my_tbl SELECT id, ... FROM tmp_tbl 创建的(其中 tmp_tbl 是一个临时表)。

有人知道这里发生了什么吗?

更新:这里似乎存在某种孤儿表情况。我尝试了以下答案中的建议,但就我而言,它们并没有解决问题。我终于使用了一种解决方法:我创建了一个具有不同名称的表(例如 my_tbl_new),将信息复制到该表并添加主键。然后我删除了原始表并将新表重命名为 my_tbl。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这样的:-

    ALTER TABLE my_tbl  DROP PRIMARY KEY, ADD PRIMARY KEY(id,id); 
    

    或者试试这个:-

    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE  CONSTRAINT_TYPE = 'PRIMARY KEY'
        AND TABLE_NAME = '[my_tbl]' 
        AND TABLE_SCHEMA ='dbo' )
    BEGIN
        ALTER TABLE [dbo].[my_tbl] ADD CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED  ([ID])
    END 
    

    或尝试像这样刷新表:-

    DROP TABLE IF EXISTS `my_tbl` ;
       FLUSH TABLES `my_tbl` ; 
       CREATE TABLE `my_tbl` ...
    

    【讨论】:

    • 试过了,但是表没有主键。我收到错误消息:Can't DROP 'PRIMARY';检查列/键是否存在
    • @hillel:- 用所有可能的解决方案更新了我的答案。检查它!
    • @Rahul:尝试第二个选项时出现相同的错误“表已存在”。尝试修复给我“表的存储引擎不支持修复”(这是一个 innoDB 表),也使用 mysqladmin flush-tables 没有改变错误。
    • @hillel:- 看看这个:- stackoverflow.com/questions/3302476/…
    • 您检查约束存在的 SQL 似乎是用于 SQL Server,而不是用于 MySQL。
    【解决方案2】:
    DROP TABLE IF EXISTS `mytable` ;
    FLUSH TABLES `mytable` ; 
    CREATE TABLE `mytable` ...
    

    也可能是权限问题。

    【讨论】:

    • 试过但仍然得到相同的输出(错误 156:表 db_name.my_tbl#1 已经存在。)
    • @hillel 你用的是什么引擎?
    • 它是 innoDB(如果重要的话,我在 Amazon RDS 上使用 MySQL)
    【解决方案3】:

    当我的数据库名称包含“-”字符时,我在尝试通过 SQLyog 更改索引时遇到了同样的问题。所以我将数据库重命名为没有它们,然后它就可以正常工作了。

    (由于没有直接重命名数据库的方法,我不得不将它复制到一个新的,并使用正确的名称)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2015-05-01
      • 2015-10-15
      相关资源
      最近更新 更多