我使用mysql工作台准备数据库布局,并使用phpmyadmin将其导出到我的数据库。当我看一张桌子时,我得到了以下警告:
不应同时为列设置主键和索引键 gid
gid
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强迫我保留那个索引呢?我不能在那里手动删除它,只要有外键。
没什么问题。即使它是当前表的整个主键,它仍然可能是正确的。事实上,除非您是那些只使用autoincrement列作为主键的“程序员”之一,否则您将看到大量的报告。
我现在解决了那个问题。在我的服务器上,默认的数据库存储引擎似乎设置为myisam,因此由于我没有明确指定它,所以所有的外键关系都被丢弃了(尽管没有这样说)。在将其转换为InnoDB之后,我不再收到警告,所以似乎一切都正常工作了。
但是,在这种特殊情况下,我会坚持使用myisam,暂时将外键关系保留在外部,因为我想自动增加该多键中的第二个属性(这是InnoDB不支持的),这对该应用程序比使用外键更有用(尤其是在有数据更新和删除时,使用我很少做)。
同样,对于MySQLworkbench,这种行为似乎仍然有点问题,而且它已经 reported .