代码之家  ›  专栏  ›  技术社区  ›  poke

MySQL中一个外部列的主键和索引键

  •  4
  • poke  · 技术社区  · 15 年前

    我使用mysql工作台准备数据库布局,并使用phpmyadmin将其导出到我的数据库。当我看一张桌子时,我得到了以下警告:

    不应同时为列设置主键和索引键 gid

    GID 是一个外部索引,它是另一个表的主键,也是当前表的主键的一部分。所以我把它作为主键的一部分,工作台为外键条目创建了一个索引。那么,为什么会出现这个警告,我应该忽略它,还是应该重新考虑我的数据库布局?

    这是一个非常简单的使用结构的例子,它产生警告:

    CREATE  TABLE IF NOT EXISTS `test_groups` (
      `gid` INT NOT NULL ,
      `gname` VARCHAR(45) NULL ,
      PRIMARY KEY (`gid`) );
    
    CREATE  TABLE IF NOT EXISTS `test_users` (
      `gid` INT NOT NULL ,
      `uid` INT NOT NULL ,
      `name` VARCHAR(45) NULL ,
      PRIMARY KEY (`gid`, `uid`) ,
      INDEX `gid` (`gid` ASC) ,
      CONSTRAINT `gid`
        FOREIGN KEY (`gid` )
        REFERENCES `test_groups` (`gid` )
        ON DELETE CASCADE
        ON UPDATE CASCADE);
    

    编辑 我尝试删除的附加索引 GID 在phpmyadmin,它似乎有效。当更改groups表中的某些内容时,级联操作仍然会发生,因此我猜想即使没有索引,外部关系也是完整的。

    但是为什么MySQLWorkbench强迫我保留那个索引呢?我不能在那里手动删除它,只要有外键。

    2 回复  |  直到 15 年前
        1
  •  2
  •   symcbean    15 年前

    没什么问题。即使它是当前表的整个主键,它仍然可能是正确的。事实上,除非您是那些只使用autoincrement列作为主键的“程序员”之一,否则您将看到大量的报告。

        2
  •  0
  •   poke    15 年前

    我现在解决了那个问题。在我的服务器上,默认的数据库存储引擎似乎设置为myisam,因此由于我没有明确指定它,所以所有的外键关系都被丢弃了(尽管没有这样说)。在将其转换为InnoDB之后,我不再收到警告,所以似乎一切都正常工作了。

    但是,在这种特殊情况下,我会坚持使用myisam,暂时将外键关系保留在外部,因为我想自动增加该多键中的第二个属性(这是InnoDB不支持的),这对该应用程序比使用外键更有用(尤其是在有数据更新和删除时,使用我很少做)。

    同样,对于MySQLworkbench,这种行为似乎仍然有点问题,而且它已经 reported .

    推荐文章