2011-05-31 60 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」不同。

相關問題