首页 文章

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

提问于
浏览
147

这是我正在使用的激烈设置的粗略过度简化 . 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 回答

  • 3
    CREATE  TABLE `mom`.`sec_subsection` (
    
      `idsec_sub` INT(11) NOT NULL ,
    
      `idSubSections` INT(11) NOT NULL ,
    
      PRIMARY KEY (`idsec_sub`, `idSubSections`) 
    
    );
    
  • 12

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

  • 4

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

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

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

  • 1

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

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

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

    所以,虽然我没有回答原来的问题,但我当然很欣赏亚当的直接回答 .

  • 3

    语法是 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)
    
  • 18

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

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

    这样,您可以将t1ID和t2ID作为指向其各自表的外键 .

  • 276

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

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

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

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

    例如:

    Table_1 有:
    Id Field
    1 A.
    2 B.

    Table_2 有:
    Id Field
    1 X.
    2 Y.

    INFO 那么可以有:
    t1ID t2ID字段
    1 1一些
    1 2数据
    2 1 in-each
    2 2排

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

相关问题