列上的主键

时间:2010-09-21 12:58:06

标签: sql

我有一个包含2列和2条记录的表。 Column1永远不会改变,但Column2可能会改变它,但table只有2条记录。

第1栏

缺少

无效

列2

\\ SQLSERVER \目的地\丢失

\\ SQLSERVER \目的地\无效

我在这里对我想要放在这张桌子上的主键很困惑,因为没有Id列。那么哪列我应该有主键?或者我是否必须添加一个带有标识的列并将主键放在其上?

由于

5 个答案:

答案 0 :(得分:4)

是。 PK列永远不能包含重复项。但它不必是整数,但它必须是唯一的非空列。

答案 1 :(得分:3)

选择候选主键和主键的标准是:

独特性,不可约性,稳定性,简单性和熟悉性

根据您所写的内容,Column1绝对是候选键。它具有以上所有5项标准。

如果表中的两个值必须始终唯一,则

Column2可能是候选键。但是,它不稳定,因此Column1是选择对表的主键引用(主键)的更好键。

您可以创建第3个数字列。由于您将表约束为2行,因此新列是否具有系统维护的序列(标识属性)几乎没有区别。

Column1熟悉,新专栏不熟悉。在话语的逻辑层面,Column1和这个新专栏同样简单。物理上,7个字符的字符串至少与64位数字一样大,因此32位数字占用的空间更少。

但是,如果你选择根据物理尺寸添加一个新列,我会考虑一个char(1)列,其中“M”表示缺失,“I”表示无效,这样仍然会占用所有5个标准,而占用较少参考表中的物理空间。

答案 2 :(得分:2)

恕我直言,你应该“总是”放一个id键然后成为主键。

“always”在引号中,因为它可以在不需要的情况下争论,但通常这是要走的路,当然可以肯定地说它是默认方法,并且应该调查它的任何偏差严格要求它的好处。

“自然”键有一个参数;也就是说你把关键词放在保证独特且永不改变的领域。但是,根据我的经验,几乎所有内容最终都会发生变化,因此使用内置的默认自动递增ID会更安全。

答案 3 :(得分:2)

在只有两条记录的表上不需要主键。主键用于提高查询速度;有2条记录你几乎看不出任何差异。

编辑: 在回应评论时,我想指出,没有主流数据库供应商强制使用主键。它们是可选的原因:除非主要功能需要主键,否则它不属于那里; YAGNI

答案 4 :(得分:0)

在一个表上,索引的创建实际上会减慢速度。索引存储为二叉树,因此在这个小表上查找,除非它的聚簇索引将导致比表扫描更多的读取。聚集索引实际上会“成为”表,但在这么小的表上,成本/收益再次“没有实际意义”。

我喜欢总是拥有唯一的行,但在这种情况下,只是让表格无法索引(称为“堆”)可能实际上是最有效的。除非你需要强制执行约束,否则我不会在表上抛出索引。对它进行索引以获得查询性能并不会对这个小表做任何事情。

如果由于某些其他原因需要将PK放在桌面上,那么我会说它放在第一列,因为它是最短的,不太可能的机会,看起来这个表基本上只是用作无论如何要查找...