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

fil*_*lip 166 mysql myisam primary-key composite-key composite-primary-key

这是我正在使用的激烈设置的粗略过度简化.table_1并且table_2两者都有自动增加代理主键作为ID.info是一个包含有关table_1和的信息的表table_2.

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)
Run Code Online (Sandbox Code Playgroud)

我试图决定,如果我应该做的主键info的ID从复合材料table_1table_2.如果我这样做,哪一个最有意义呢?
(在这个例子中,我将ID 11209与ID 437相结合)

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

或者是其他东西?

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

Ale*_*use 314

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

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 
Run Code Online (Sandbox Code Playgroud)

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

  • @AlexCuse两列的_combination_都是唯一的,但是对于t1ID = 11209,可以有任意数量的t2ID. (35认同)
  • 哦,哇,这就是您制作复合键的方式!看来我已经完全误解了这个概念。谢谢!!所以像这样的东西完全是为了索引的目的然后正确吗?就像在我无法通过使用此复合文件来引用记录一样,我仍然必须这样做,`UPDATE info ... WHERE t1ID = 11209 AND t2ID = 437`吗? (2认同)
  • 正确.虽然两列都应该是唯一的,但t1ID = 11209可能就足够了. (2认同)

wmo*_*rse 19

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

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

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

  • 我没有真正令人信服的理由,我承认这是我和我的一些同事之间的争论点,因为减少列数更为经济.我发现在单个外键上编写连接更容易.有时,这些表"两个表之间的映射"的重要性变得与原始表一样重要,并且其主键成为其他表中的外键列. (2认同)

Rit*_*tam 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)
);
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)
Run Code Online (Sandbox Code Playgroud)


小智 7

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

alter table employee add primary key(emp_id,emp_name);
Run Code Online (Sandbox Code Playgroud)


Kil*_*ire 5

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

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

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

因此,虽然我没有回答最初的问题,但我当然感谢 Adam 的直接回答。