主键可以包含多个列吗?

时间:2011-05-31 19:50:26

标签: sql

  

可能重复:
  is this possible to made two primary key in one table

是否可以在MySQL中的多个columne上定义主键?

如何在create table声明中表明这一点?

4 个答案:

答案 0 :(得分:9)

是的,你绝对可以。

这是一个链接:

http://sqlzoo.net/howto/source/z.dir/tip241027/mysql

以下是基本语法:

CREATE TABLE myTable(
myCol1 INTEGER  NOT NULL,
myCol2 CHAR(10) NOT NULL,
myCol3 INTEGER NOT NULL,
myCol4 CHAR(1),
PRIMARY KEY (myCol1 , myCol2 , myCol3 )
)

答案 1 :(得分:2)

是的,它可以 CREATE TABLE table1(col1 INT NOT NULL, col2 INT NOT NULL, PRIMARY KEY(col1,col2));

<强>更新
这是可能的,但我不建议过度使用mysql INNODB表的复合主键。对于INNODB引擎,主键也是一个聚簇索引,它定义行数据的物理位置。作为PK一部分的任何列的频繁更改都会导致外部碎片,从而导致性能下降。 2列上的唯一键可以更好地工作 当然,当你实现多对多关系

时,复合PK是一个不错的选择

答案 2 :(得分:2)

您可以使用:

CREATE TABLE tableName (
firstName varchar(10) NOT NULL,
surname varchar(20) NOT NULL,
primary key(firstName,surname)
);

当我使用查找表连接多对多字段时,我个人使用此结构:

CREATE TABLE personPhoneNumbersLookup (
personID int(3) NOT NULL,
phoneNumberID int(4) NOT NULL,
primary key(personID,phoneNumberID)
);

确保我只将一个特定的人连接到一个特定的电话号码一次。虽然显然,同一personID可用于其他电话号码,但多个电话号码可以连接到同一个人。

答案 3 :(得分:1)

正如其他人所说的那样......是的,你可以...但是,在许多系统中,表格将具有“代理”自动增量键,这些键将是您的“主要”并且在大多数情况下用于您的连接......这样可以防止像其他表格中的MyCol1,MyCol2,MyCol3和FirstName,SurName等样本等其他数据重复。

此外,您可以拥有一个“候选”键,该键是对主要内容添加的表的唯一索引,例如重复条目阻止或“查找”目的。按名称进行查找是一回事。然后,当你有他们的“代理人”ID时,这就是系统中其他地方使用的密钥......例如:你会找到多少次与完全不相关的条目的“Bob Smith”......但ID#3892 123 Anyplace的“Bob Smith”与ID#28928“Bob Smith”在983 Wrong Street不同。