我能够在一个表中拥有多个主键吗? mysql
以比我能作的更好的方式给出了良好的技术答案。 我只能添加到这个主题: sql
若是你想要一些不容许/不可接受的东西,那么就有理由退一步。 数据库
但愿它会帮助某人。 网络
主键是惟一标识记录的密钥,用于全部索引。 这就是为何你不能有多个。 它一般也是用于链接子表的密钥,但这不是必需的。 PK的真正目的是确保某些内容容许您惟一地标识记录,以便数据更改影响正确的记录,从而能够建立索引。 性能
可是,您能够将多个字段放在一个主键中(复合PK)。 这将使您的链接速度变慢(特别是若是它们是更大的字符串类型字段)而且您的索引更大但它可能会删除在某些子表中进行链接的须要,所以就性能和设计而言,请将其链接到一个案例案例基础。 当你这样作时,每一个字段自己并非惟一的,但它们的组合是。 若是组合键中的一个或多个字段也应该是惟一的,那么您须要一个惟一索引。 尽管若是一个字段是惟一的,这多是PK的更好的候选者。 测试
如今有时,你有不止一个PK的候选人。 在这种状况下,您选择一个做为PK或使用代理键(我我的更喜欢这个实例的代理键)。 而且(这很关键!)您为每一个未被选为PK的候选键添加惟一索引。 若是数据须要是惟一的,则不管是否为PK,都须要一个惟一的索引。 这是一个数据完整性问题。 (注意,只要您使用代理键,这也是正确的;人们遇到代理键时会遇到麻烦,由于他们忘记在候选键上建立惟一索引。) spa
有时你须要一个以上的代理键(若是你有它们一般是PK)。 在这种状况下你想要的不是更多的PK,而是带有自动生成键的更多字段。 大多数数据库不容许这样作,但有办法绕过它。 首先考虑是否能够根据第一个自动生成的密钥(例如Field1 * -1)计算第二个字段,或者是否须要第二个自动生成的密钥实际上意味着您应该建立一个相关的表。 相关表能够是一对一的关系。 您能够经过将父表中的PK添加到子表,而后将新的自动生成字段添加到表中,而后将适用于此表的任何字段添加到子表中来强制执行此操做。 而后选择两个键中的一个做为PK并在另外一个上放置惟一索引(自动生成的字段没必要是PK)。 并确保将FK添加到父表中的字段。 一般,若是子表没有其余字段,则须要检查为何您认为须要两个自动生成的字段。 设计
您只能拥有一个主键,但主键中能够有多个列。 代理
您还能够在表上使用惟一索引,这将有点像主键,由于它们将强制执行惟一值,并将加快查询这些值。 code
表能够有一个复合主键 ,它是由两列或更多列组成的主键。 例如:
CREATE TABLE userdata ( userid INT, userdataid INT, info char(200), primary key (userid, userdataid) );
更新: 这是一个连接 ,其中包含复合主键的更详细说明。
有些人使用术语“主键”来表示一个整数列,它经过某种自动机制生成其值。 例如,MySQL中的AUTO_INCREMENT
或Microsoft SQL Server中的IDENTITY
。 你是否在这个意义上使用主键?
若是是这样,答案取决于您正在使用的数据库的品牌。 在MySQL中,你不能这样作,你获得一个错误:
mysql> create table foo ( id int primary key auto_increment, id2 int auto_increment ); ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
在某些其余品牌的数据库中,您能够在表中定义多个自动生成列。