我使用MySQL工作台准备数据库布局,并使用phpMyAdmin将其导出到数据库。在查看一张表时,我收到了以下警告:
不应同时为列
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);编辑I尝试删除phpMyAdmin中gid的附加索引,它似乎有效。当更改组表中的某些内容时,级联操作仍然会发生,所以我想即使没有索引,外部关系也是完整的。
但是为什么MySQL工作台强迫我保留这个索引呢?只要外键在那里,我就不能手动移除它。
发布于 2010-01-20 12:16:53
我现在解决了那个问题。在我的服务器上,默认的数据库存储引擎似乎被设置为MyISAM,所以由于我没有明确地指定它,所以所有的外键关系都被丢弃了(尽管没有这么说)。在将其转换为InnoDB后,我不再收到警告,因此似乎一切都正常工作。
但是,在这种特殊情况下,我将坚持使用MyISAM,并且暂时不使用外键关系,因为我希望自动增加多键中的第二个属性(这是InnoDB不支持的),对于这个应用程序来说,这比拥有外键更有用(特别是当数据中很少进行更新和删除时)。
另外,关于MySQL工作台,这种行为似乎仍然有点错误,而且已经是已报告了。
发布于 2010-01-20 11:40:22
没什么不对的。即使它是当前表的整个主键,它仍然可能是正确的。实际上,除非您是那些只对主键使用自动增量列的“程序员”之一,否则您将看到大量的报告。
https://stackoverflow.com/questions/2100424
复制相似问题