如何正确创建复合主键 - MYSQL

时间:2011-04-29 18:38:48

标签: mysql primary-key myisam composite-key composite-primary-key

这是我正在使用的激烈设置的粗略过度简化。 table_1table_2都有自动增加代理主键作为ID。 info是一个表格,其中包含有关table_1table_2的信息。

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

我正在尝试决定是否应将info的主键与table_1table_2的ID组合在一起。如果我这样做,哪一个最有意义?
(在此示例中,我将ID 11209与ID 437合并)

INT(9) 11209437 (我可以想象为什么这很糟糕)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

还是其他什么?

将它用作MYSQL MYISAM数据库的主键可以吗?

8 个答案:

答案 0 :(得分:294)

我会使用复合(多列)键。

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

这样你就可以将t1ID和t2ID作为指向各自表的外键。

答案 1 :(得分:20)

我不会使“info”表的主键成为其他表中两个值的组合。

其他人可以更好地阐明原因,但是有一个真正由两条信息组成的专栏感觉不对。如果您想出于某种原因对第二个表中的ID进行排序,该怎么办?如果要计算任一表中值的存在次数该怎么办?

我总是把这些作为两个不同的列。您可以在mysql中使用两列primay键... PRIMARY KEY(id_a,id_b)...但我更喜欢使用两列唯一索引,并且具有自动增量主键字段。

答案 2 :(得分:14)

语法为 CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3) ,例如::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

如果您在创建表格时正在编写上述示例,例如::

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

要将此约束添加到现有表,您需要遵循以下语法

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)

答案 3 :(得分:4)

复合主键是您想要与事实表创建多对多关系的地方。例如,您可能有一个假日租赁套餐,其中包含许多属性。另一方面,该物业也可作为多个租赁套餐的一部分提供,可单独使用,也可与其他物业一同使用。在此方案中,您使用属性/包事实表建立属性和租赁包之间的关系。属性和包之间的关联将是唯一的,您将只使用property_id与属性表和/或package_id与包表进行连接。每个关系都是唯一的,auto_increment键是多余的,因为它不会在任何其他表中显示。因此,定义复合键就是答案。

答案 4 :(得分:4)

假设您已经创建了一个表,现在可以使用此查询来创建复合主键

alter table employee add primary key(emp_id,emp_name);

答案 5 :(得分:3)

除个人设计偏好外,还有一些人希望使用复合主键。表可以具有两个或多个提供唯一组合的字段,而不一定是通过外键。

例如,每个美国州都有一套独特的国会选区。虽然许多州可能单独拥有CD-5,但在50个州中的任何一个州都不会有超过一个CD-5,反之亦然。因此,为Massachusetts CD-5创建自动编号字段将是多余的。

如果数据库驱动动态网页,则编写代码以查询双字段组合可能比提取/重新提交自动编号密钥简单得多。

因此,虽然我没有回答原来的问题,但我当然很欣赏亚当的直接回答。

答案 6 :(得分:1)

CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);

答案 7 :(得分:1)

@AlexCuse我想将此作为评论添加到您的答案中,但在多次尝试在评论中添加换行符失败后放弃了。

也就是说,t1ID在table_1中是唯一的,但这也不会使它在INFO表中独一无二。

例如:

Table_1 有:
Id Field
1 A
2 B

表_2 有:
Id Field
1 X
2 Y

INFO 则可以:
t1ID t2ID字段
1 1有些
1 2数据
2 1 in-each
2 2行

因此,在INFO表中唯一标识一行,您需要t1ID和t2ID