可以在单个表中有多个主键?

2008-10-20 09:56:23
问题评论:

回答:

您可以有一个组合主键是一个主要由两个或多个列的键。例如︰

CREATE TABLE userdata (
  userid INT,
  userdataid INT,
  info char(200),
  primary key (userid, userdataid),
);

更新︰这是一个链接的复合主键更详细的说明。

对于链接,Adam + 1。一定帮我出了很多。谢谢。

您只能有一个主键,但您可以有多列主键中。

此外可以在表中,这有点像一个主键将工作,因为他们将强制使用唯一值,并将加快查询这些值的唯一索引。

对于涉及唯一索引 + 1

一个表可以有多个候选键。每个候选键是一列或唯一,集合在一起,也不为 NULL 的列集。因此,指定的任何候选键的所有列的值根本不足以确定符合条件,都占一行或没有行。

候选关键字是关系数据模型中的基本概念。

它是常见的做法,如果多个键都在一个表中,以一个候选键指定为主键。它也是常见的做法会导致引用主键的表的外键,而不是其它候选键。

我建议这些做法,但没有什么需要选择主键的候选键之间的关系模型中。

同意。所有项都是在逻辑模型等 (无为主)。选择物理实现获取中的键的主键指定任意和供应商/产品而定。

我想说它是依赖于数据库设计器。

我只碰到过这种所需的用例。我有一个表将创建和管理由实体框架-就可以收集在不支持非主键唯一复合约束存在的。但是它不支持复合主关键字。数据还将会被链接到的远程数据库系统上不支持复合键。我走在 EF 中创建复合 PK 但还添加其他系统可用于唯一标识与非可以为 null 的 GUID 列。

丽丽,我说,关系模型不需要主键。我什么也没说关于是否某些工具可能需要它们。但是我采取您的观点。

这是两个主要问题和 @Kalmi 的问题的答案

具有多个自动生成的列的点是什么?

下面这段代码有复合主键。它的列之一是自动递增。这将仅在 MyISAM 中起作用。InnoDB 会生成错误"错误 1075 (42000)︰ 不正确的表定义;可以有一个自动列,它必须作为一个注册表项定义".

DROP TABLE IF EXISTS `test`.`animals`;
CREATE TABLE  `test`.`animals` (
  `grp` char(30) NOT NULL,
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `name` char(30) NOT NULL,
  PRIMARY KEY (`grp`,`id`)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;

Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

这工作如果您自动递增列第一次在中指定该主键定义。(也许这改变,我只是对其测试 5.6 中)

正如其他人说过就可以有多列主键。应注意但是是否不按关键字引入一些功能的依赖项,您应考虑规范化您的关系。

示例︰

Person(id, name, email, street, zip_code, area)

id -> name,email, street, zip_code and area之间可以有功能的依赖项,但通常zip_codearea相关联并且因此没有内部的功能依赖关系之间zip_code -> area.

因此,一个可以考虑将它拆分为另一个表︰

Person(id, name, email, street, zip_code)
Area(zip_code, name)

以使其符合第三范式测试.

请输入您的翻译

Can I have multiple primary keys in a single table?

确认取消