MySQL中一个外部列的主键和索引键
我使用MySQL Workbench准备数据库布局,并使用phpMyAdmin将其导出到我的数据库。当我看一张桌子时,我得到了以下警告: 不应同时为列MySQL中一个外部列的主键和索引键,mysql,foreign-keys,primary-key,Mysql,Foreign Keys,Primary Key,我使用MySQL Workbench准备数据库布局,并使用phpMyAdmin将其导出到我的数据库。当我看一张桌子时,我得到了以下警告: 不应同时为列gid设置主键和索引键 gid是一个外部索引,它是不同表的主键,也是当前表主键的一部分。所以我将它作为主键的一部分,Workbench为外键条目创建了一个索引。那么,为什么会出现这样的警告,我应该忽略它,还是应该重新考虑我的数据库布局 这是所用结构的一个非常简化的示例,它会产生警告: CREATE TABLE IF NOT EXISTS `tes
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);
edit我尝试删除phpMyAdmin中的gid
的附加索引,似乎效果不错。更改groups表中的某些内容时仍会发生级联操作,因此我猜即使没有索引,外部关系也会保持完整
但为什么MySQL Workbench强迫我保留那个索引呢?只要外键在那里,我就无法手动删除它。这没什么问题。即使它是当前表的整个主键,它也可能是正确的。事实上,除非你是那些只使用自动增量列作为主键的“程序员”,否则你会看到很多这样的报道。我现在解决了这个问题。在我的服务器上,默认的数据库存储引擎似乎被设置为MyISAM,所以因为我没有明确指定它,所以所有外键关系都被丢弃了(尽管没有这样说)。在将其转换为InnoDB后,我不再收到警告,因此看起来一切都正常工作
但是在这种特殊情况下,我将坚持使用MyISAM,暂时将外键关系保留在外部,因为我希望自动增加该多键中的第二个属性(InnoDB不支持该属性),这比使用外键对该应用程序更有用(特别是当数据很少更新和删除时)
同样关于MySQL Workbench,这种行为似乎仍然有点问题,而且已经有了。因此,为外键创建附加索引是正确的?很抱歉,但我没有得到您答案的第二部分。对不起-我认为这是对将字段同时作为主键和外键的问题。是的,第二部分索引是多余的,mysql会很高兴地使用主键索引返回由“gid”查询的行。它的效率会稍微低一点,但您永远无法测量差异。C.该错误被错误地标记为与其他某个固定错误的重复。