Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中一个外部列的主键和索引键_Mysql_Foreign Keys_Primary Key - Fatal编程技术网

MySQL中一个外部列的主键和索引键

MySQL中一个外部列的主键和索引键,mysql,foreign-keys,primary-key,Mysql,Foreign Keys,Primary Key,我使用MySQL Workbench准备数据库布局,并使用phpMyAdmin将其导出到我的数据库。当我看一张桌子时,我得到了以下警告: 不应同时为列gid设置主键和索引键 gid是一个外部索引,它是不同表的主键,也是当前表主键的一部分。所以我将它作为主键的一部分,Workbench为外键条目创建了一个索引。那么,为什么会出现这样的警告,我应该忽略它,还是应该重新考虑我的数据库布局 这是所用结构的一个非常简化的示例,它会产生警告: CREATE TABLE IF NOT EXISTS `tes

我使用MySQL Workbench准备数据库布局,并使用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);
edit我尝试删除phpMyAdmin中的
gid
的附加索引,似乎效果不错。更改groups表中的某些内容时仍会发生级联操作,因此我猜即使没有索引,外部关系也会保持完整


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

这没什么问题。即使它是当前表的整个主键,它也可能是正确的。事实上,除非你是那些只使用自动增量列作为主键的“程序员”,否则你会看到很多这样的报道。

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

但是在这种特殊情况下,我将坚持使用MyISAM,暂时将外键关系保留在外部,因为我希望自动增加该多键中的第二个属性(InnoDB不支持该属性),这比使用外键对该应用程序更有用(特别是当数据很少更新和删除时)


同样关于MySQL Workbench,这种行为似乎仍然有点问题,而且已经有了。

因此,为外键创建附加索引是正确的?很抱歉,但我没有得到您答案的第二部分。对不起-我认为这是对将字段同时作为主键和外键的问题。是的,第二部分索引是多余的,mysql会很高兴地使用主键索引返回由“gid”查询的行。它的效率会稍微低一点,但您永远无法测量差异。C.该错误被错误地标记为与其他某个固定错误的重复。