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

eyh26e7m  于 12个月前  发布在  Mysql
关注(0)|答案(8)|浏览(120)

下面是我正在使用的一个密集设置的过度简化。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 (我可以想象为什么这是坏的)
11209-437
DECIMAL (10,4) 1209.437
还是别的什么?
将其用作MYSQL MYISAM DB上的主键可以吗?

bq8i3lrv

bq8i3lrv1#

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

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

字符串
这样,您就可以将t1ID和t2ID作为指向其各自表的外键。

jmo0nnb3

jmo0nnb32#

我不会将“info”表的主键设置为来自其他表的两个值的组合。
其他人可以更好地阐明原因,但让一列真正由两条信息组成感觉是不对的。如果出于某种原因想要对第二个表中的ID进行排序,那该怎么办?如果想要计算来自任何一个表的值出现的次数,那该怎么办?
你可以在mysql中使用一个两列的主键. PRIMARY KEY(id_a,id_B).但是我更喜欢使用一个两列的唯一索引,并有一个自动递增的主键字段。

thtygnil

thtygnil3#

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

kqhtkvqz

kqhtkvqz4#

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

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

字符串

mzillmmw

mzillmmw5#

除了个人设计偏好之外,还有一些情况下,人们希望使用复合主键。表可能有两个或多个字段提供唯一的组合,而不一定是通过外键。
例如,美国的每个州都有一组唯一的国会选区。虽然许多州可能各自有一个CD-5,但在50个州中的任何一个州都不会有一个以上的CD-5,反之亦然。因此,为马萨诸塞州CD-5创建自动编号字段将是多余的。
如果数据库驱动一个动态网页,那么编写代码来查询两个字段的组合可能比提取/重新提交一个自动编号的键要简单得多。
所以,虽然我没有回答最初的问题,我当然感谢亚当的直接回答。

shstlldc

shstlldc6#

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

nr7wwzry

nr7wwzry7#

CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);

字符串

zi8p0yeb

zi8p0yeb8#

@AlexCuse我想把这个作为评论添加到你的回答中,但在多次尝试在评论中添加换行符失败后放弃了。
也就是说,t1IDtable_1中是唯一的,但这并不意味着它在INFO表中也是唯一的。
举例来说:

表1有:

Id字段
1 A
2 B

表2有:

Id字段
1 X
2 Y

INFO则可以有:

t1 ID t2 ID字段
11一些
12个数据
2 1 in-each
2 2行
因此,在INFO表中,要唯一标识一行,需要t1IDt2ID

相关问题