212

这是我正在使用的密集设置的严重过度简化。table_1并且table_2两者都具有自动增量代理主键作为 ID。info是一个包含关于table_1和的信息的表table_2

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

我正在尝试决定是否应该将和info的 ID 组合作为主键。如果我要这样做,其中哪一个最有意义?(在此示例中,我将 ID 11209 与 ID 437 结合使用)table_1table_2

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

或者是其他东西?

将其用作 MYSQL MISAM DB 上的主键可以吗?

4

8 回答 8

399

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

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

这样,您也可以将 t1ID 和 t2ID 作为指向它们各自表的外键。

于 2011-04-29T18:47:09.243 回答
24

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

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

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

于 2011-04-29T19:27:45.200 回答
20

语法是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)
于 2013-03-26T16:58:54.923 回答
13

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

alter table employee add primary key(emp_id,emp_name);
于 2017-08-23T06:16:29.983 回答
5

除了个人设计偏好之外,在某些情况下还想使用复合主键。表可能有两个或多个提供唯一组合的字段,不一定通过外键。

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

如果数据库驱动一个动态网页,编写代码来查询两个字段的组合可能比提取/重新提交自动编号的键简单得多。

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

于 2013-10-17T11:15:26.000 回答
4

复合主键是您想要与事实表创建多对多关系的地方。例如,您可能有一个假期租赁套餐,其中包含许多房产。另一方面,该物业也可以作为多个租赁套餐的一部分单独使用或与其他物业一起使用。在这种情况下,您使用属性/包事实表建立属性和租赁包之间的关系。属性和包之间的关联将是唯一的,您只能将 property_id 与属性表和/或 package_id 与包表一起使用。每个关系都是唯一的,并且 auto_increment 键是多余的,因为它不会出现在任何其他表中。因此,定义复合键就是答案。

于 2013-03-12T18:43:43.850 回答
2
CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);
于 2012-02-07T08:32:51.780 回答
1

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

也就是说, t1ID 在 table_1 中是唯一的,但这并不意味着它在 INFO 表中也是唯一的。

例如:

Table_1有:
Id 字段
1 A
2 B

Table_2有:
Id 字段
1 X
2 Y

INFO然后可以有:
t1ID t2ID field
1 1 some
1 2 data
2 1 in-each
2 2 row

所以在 INFO 表中唯一标识一行你需要 t1ID 和 t2ID

于 2014-06-05T13:45:03.957 回答