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

| 这是我正在使用的密集设置的过度简化。
table_1
table_2
都具有自动递增替代主键作为ID。
info
是一个表,其中包含有关
table_1
和ѭ1information的信息。
table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)
我试图确定是否应该将
info
的主键组合为
table_1
table_2
的ID。如果我要这样做,哪一个最有意义? (在此示例中,我将ID 11209与ID 437组合在一起)
INT(9)
11209437(我可以想象为什么这很糟糕)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437 或者是其他东西? 将其用作MYSQL MYISAM DB上的主键是否可以?     
已邀请:
我会使用一个复合(多列)键。
CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 
这样,您还可以将t1ID和t2ID作为指向它们各自表的外键。     
我不会使“ info”表的主键成为其他表的两个值的组合。 其他人可以更好地阐明原因,但是拥有一列真正由两部分信息组成的列是错误的。如果出于某种原因要对第二张表的ID进行排序怎么办?如果要计算任一表中某个值出现的次数怎么办? 我将始终将它们保留为两个不同的列。您可以在mysql中使用两列素数键... PRIMARY KEY(id_a,id_b)...但我更喜欢使用两列唯一索引,并具有自动递增的主键字段。     
语法为“ 13”,例如::
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)
    
假设您已经创建了一个表,现在可以使用此查询来创建复合主键
alter table employee add primary key(emp_id,emp_name);
    
复合主键是您想要在事实表中创建多对多关系的地方。例如,您可能有一个假期租赁套餐,其中包含许多属性。另一方面,该物业也可以单独或与其他物业一起作为许多租赁套餐的一部分使用。在这种情况下,您可以使用属性/包事实表在属性和租赁包之间建立关系。属性和包之间的关联将是唯一的,您将永远只将property_id与属性表一起使用和/或package_id与package表一起使用。每个关系都是唯一的,并且auto_increment键是多余的,因为它不会在任何其他表中使用。因此,定义组合键就是答案。     
除了个人设计偏好外,在某些情况下,人们还想使用复合主键。表可以具有两个或多个字段,这些字段提供唯一的组合,而不必使用外键。 例如,美国每个州都有一套独特的国会区。尽管许多州可能单独拥有CD-5,但在这50个州中,任何一个州的CD-5都不会超过一个,反之亦然。因此,为马萨诸塞州CD-5创建一个自动编号字段将是多余的。 如果数据库驱动动态网页,则编写代码以在两字段组合上进行查询可能比提取/重新提交自动编号的密钥简单得多。 因此,尽管我没有回答原始问题,但我当然感谢亚当的直接回答。     
CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);
    
@AlexCuse我想将此添加为注释,但是在多次尝试在注释中添加换行符失败之后放弃了。 也就是说,t1ID在table_1中是唯一的,但是在INFO表中也没有使其唯一。 例如: 表_1具有: 编号栏位 1个 2个 表_2具有: 编号栏位 1 X 2年 INFO然后可以具有: t1ID t2ID字段 1 1一些 1 2数据 2每个1 2 2行 因此,在INFO表中以唯一地标识一行,您既需要t1ID又需要t2ID     

要回复问题请先登录注册