2011-05-31 48 views
1

可能重复:
is this possible to made two primary key in one table主键是否可以包含多个列?

是否有可能确定在MySQL上的多个columne主键?

这是如何在create table声明中指出的?

+2

@Michael Todd:这个问题的意图似乎有很大的不同,不是重复的,我意识到接受问题的一部分确实涉及到与这里提到的相同的问题。 – 2011-05-31 19:58:14

+0

@迈克尔:感觉沮丧? – user741684 2011-05-31 19:59:42

+1

没有。只是想确保一个干净的网站。 – 2011-05-31 20:11:18

回答

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) 
) 
2

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

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

+0

+1同样适用于SQL Server - 默认情况下,主键是集群键,并且应该是窄和静态的 - 并非总是使用复合键给定的。另外:复合键使得加入一个混乱的业务 - 我尽量避免它尽可能多 – 2011-06-01 04:56:22

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可以用于其他电话号码,并且多个电话号码可以连接到同一个人。

+0

非常聪明!和信息。谢谢 – user741684 2011-05-31 20:04:18

1

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

此外,您可以拥有一个“候选”键,这是一个UNIQUE索引,用于添加到主要表中的表,例如重复条目预防或“查找”目的。按名称查询是一回事。然后,当你有他们的“Surrogate”ID时,这是系统中其他地方使用的关键......例如:你会找到一个完全不相关条目的“Bob Smith”多少次......但ID#3892位于123 Anyplace的“Bob Smith”与位于983 Wrong Street的ID#28928“Bob Smith”不同。

相关问题