MySQL中一个FOREIGN列的PRIMARY和INDEX键

时间:2010-01-20 09:58:37

标签: mysql foreign-keys primary-key

我使用MySQL Workbench准备数据库布局,并使用phpMyAdmin将其导出到我的数据库。看一张桌子时,我收到了以下警告:

  

不应为列gid

设置PRIMARY和INDEX键

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

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

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);

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

但为什么MySQL Workbench强迫我保留该索引?只要外键在那里,我就无法手动删除它。

2 个答案:

答案 0 :(得分:2)

没错。即使它是当前表的整个主键,它仍然可能是正确的。实际上,除非你是那些只使用自动增量列作为主键的“程序员”之一,否则你会看到很多报道。

答案 1 :(得分:0)

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

然而在这种特殊情况下,我会坚持使用MyISAM,并暂时将外键关系保留在外面,因为我想在该多键中自动递增第二个属性(InnoDB不支持),对于这个应用程序而言,这比使用外键更有用(特别是在拥有很少进行更新和删除的数据时)。

同样关于MySQL Workbench,这种行为似乎仍然有点错误,它已经是reported

相关问题