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_1
和table_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作为指向其各自表的外键.
wmo*_*rse 19
我不会使"info"表的主键成为其他表中两个值的组合.
其他人可以更好地阐明原因,但是有一个真正由两条信息组成的专栏感觉不对.如果您想出于某种原因对第二个表中的ID进行排序,该怎么办?如果要计算任一表中的值的次数,该怎么办?
我总是把这些作为两个不同的列.您可以在mysql中使用两列primay键... PRIMARY KEY(id_a,id_b)...但我更喜欢使用两列唯一索引,并且具有自动增量主键字段.
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)
除了个人设计偏好之外,有些情况下还希望使用复合主键。表可能有两个或多个提供唯一组合的字段,不一定通过外键。
例如,美国的每个州都有一组独特的国会选区。虽然许多州可能单独拥有一张 CD-5,但 50 个州中的任何一个州都不会超过一张 CD-5,反之亦然。因此,为马萨诸塞州 CD-5 创建自动编号字段将是多余的。
如果数据库驱动动态网页,编写代码来查询两个字段的组合可能比提取/重新提交自动编号的键简单得多。
因此,虽然我没有回答最初的问题,但我当然感谢 Adam 的直接回答。
归档时间: |
|
查看次数: |
294930 次 |
最近记录: |