Mysql表复合键

时间:2013-08-08 20:52:54

标签: mysql foreign-keys

我有这个表定义。

 CREATE TABLE `friendship` (
  `fID` bigint(20) NOT NULL AUTO_INCREMENT,
  `Part1` bigint(20) NOT NULL DEFAULT '0',
  `Part2` bigint(20) NOT NULL DEFAULT '0',
  `AddedBy` bigint(11) NOT NULL DEFAULT '0',
  `Accepted` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`fID`),
  KEY `Part1` (`Part1`,`Part2`),
  KEY `Part1_2` (`Part1`),
  KEY `Part2` (`Part2`),
  KEY `AddedBy` (`AddedBy`),
  KEY `Accepted` (`Accepted`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

有人可以解释为什么关键" Part1"包含Part1和Part2,这有什么好/坏的一面? 在Part1 / Part2上使用FK更好吗?

在MyISAM和InnoDB表上使用它有什么性能差异吗?

2 个答案:

答案 0 :(得分:1)

你有一个错误的命名约定,一方面。我希望键名为:

KEY `Part1_2` (`Part1`,`Part2`),
KEY `Part1` (`Part1`),

在任何情况下,都不需要只有Part1的密钥。复合键(Part1,Part2)可以在任何使用Part1的地方使用。

答案 1 :(得分:1)

  

有人可以解释为什么键“Part1”包含Part1和Part2,以及   这有什么好/坏的一面?

据我所知,这只是错误的命名。就性能和数据完整性而言,这里的名称并不重要。如果您以后需要按名称删除它,可能会很麻烦。

就像戈登·林诺夫所说,你问题中名为“Part1_2”的密钥可以删除。

  

在Part1 / Part2上使用FK更好吗?

这些列中没有任何唯一约束。 MySQL 仍然允许你用外键引用它们,但MySQL文档告诉你不要这样做。 (允许这是一个错误;记录它比修复它更容易。)

MySQL中的

Key 并不意味着它在其他SQL dbms中意味着什么。在 CREATE TABLE语句中,KEY is a synonym for INDEX;它不是UNIQUE的同义词,也不是PRIMARY KEY的简写。此表中唯一可以由外键约束安全引用的列是fID。

  

在MyISAM和InnoDB上使用它有什么性能差异   表

InnoDB支持行级锁定,事务和外键约束。 MyISAM没有。在考虑性能差异之前,我会担心这些差异。如果您的数据库给出了错误的答案,它的运行速度并不重要。