2012-10-06 47 views
33

我有一个表中有两个int值是ID。在他们自己这些ID可以在表中显示任何次数,但他们在一起应该只出现一次。MySQL - 使一对值唯一

有没有办法使一对值独一无二,并且仍然允许多次显示各个值?

作为后续,如果这是可能的,那么这对值可以用作关键吗?我目前有第三列为我的密钥的唯一自动增量值。

+0

什么是你的意图这里?为了保持组合的独特性,还是需要使用两者来标识行? –

回答

50

这就是所谓的复合键。

如果你想你的实际PK更改为复合之一,使用

Alter table <your table> drop PRIMARY KEY; 
Alter table <your table> drop COLUMN <your autoincremented column>; 

Alter table <your table> add [constraint <constraint name>] PRIMARY KEY (<col1>, <col2>); 

你也可以添加一个唯一约束(你的PK将是相同的,独特的双...将不得不是独一无二的)。个人而言,我会推荐第二种解决方案(简单PK +唯一约束),但这只是个人观点。你可以谷歌搜索关于复合键的优点和缺点。

[]之间的部分是可选的。

编辑

如果你想做到这一点在创建表语句

对于复合PK

CREATE TABLE Test(
     id1 int NOT NULL, 
     id2 int NOT NULL, 
     id3 int NOT NULL, 
     PRIMARY KEY (id1, id2) 
    ); 

对于唯一索引

CREATE TABLE Test1(
     id1 int NOT NULL AUTO_INCREMENT, 
     id2 int NOT NULL, 
     id3 int NOT NULL, 
     PRIMARY KEY (id1), 
     UNIQUE KEY (id2, id3) 
    ); 
+3

+1时,我发现你需要'DROP KEY'来指定组合键,这可以帮助像我这样的人了解这个新功能 –

+0

你还添加了一个例子,这是如何在'CREATE TABLE'语句中完成的? –

+0

@TomášZato见编辑。 –

0

添加primary key (col1, col2)您创建表定义

7

试试这个:ALTER TABLE table_name ADD CONSTRAINT uc_name UNIQUE (col1,col2)

+0

我以为是'*更好的方法*'; mysql至少会阻止这种意图并将其转换为'UNIQUE KEY' ... ...与之相同:'ALTER TABLE面板ADD UNIQUE KEY name_label_UNIQUE(name,label);'。另外,当你添加:'CONSTRAINT ... UNIQUE' * ho hum * – will