我使用MySQL Workbench准备数据库布局,并使用phpMyAdmin将其导出到我的数据库。看一张桌子时,我收到了以下警告:
不应为列
设置PRIMARY和INDEX键gid
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强迫我保留该索引?只要外键在那里,我就无法手动删除它。
答案 0 :(得分:2)
没错。即使它是当前表的整个主键,它仍然可能是正确的。实际上,除非你是那些只使用自动增量列作为主键的“程序员”之一,否则你会看到很多报道。
答案 1 :(得分:0)
我现在解决了这个问题。似乎默认的数据库存储引擎在我的服务器上设置为MyISAM,因为我没有明确指定它,所有外键关系都被丢弃(尽管如此)。在将其转换为InnoDB之后,我不再收到警告,因此看起来一切正常。
然而在这种特殊情况下,我会坚持使用MyISAM,并暂时将外键关系保留在外面,因为我想在该多键中自动递增第二个属性(InnoDB不支持),对于这个应用程序而言,这比使用外键更有用(特别是在拥有很少进行更新和删除的数据时)。
同样关于MySQL Workbench,这种行为似乎仍然有点错误,它已经是reported。