为什么主键有自己的名称?


19

从数学的角度来看,假设一个表最多具有一个主键,那么用某种任意名称而不是简单的表属性来引用主键似乎是一个短时的设计决策。

因此,要将主键从非集群键更改为集群键,反之亦然,您必须首先搜索其名称,然后删除它,最后读取它。

使用我看不到的任意名称是否有一些优势,或者DBMS不对主键使用任意名称?

编辑2011-02-22 (对于那些不想在那里排序的人,则为02/22/2011):

让我展示一下该函数,您可以使用该函数从其表名派生主键的名称(使用早期的sql-sever aka sybase系统表):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

如gbn所述,当您不提供显式名称时,没有人真的喜欢生成的名称:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

我刚得到

PK__example___3213E83F527E2E1D

但是,为什么sysobjects中的名称必须唯一。对表及其主键使用完全相同的名称将是完全可以的。

这样,我们就不需要建立命名约定,而这可能会被意外违反。

现在回答玛丽安:

  1. 我仅以将集群更改为非集群主键为例,在该示例中,我需要知道pk的实际名称才能删除它。
  2. 事物不需要适当的名称,只要可以轻松地进行唯一表示就足够了。那是抽象的基础。面向对象的编程就是这样。您无需为不同类的相似属性使用不同的名称。
  3. 它是任意的,因为它是表的属性。该表的名称就是您要使用的所有信息。

Answers:


17

主键(和其他唯一约束)被实现为索引,并且以完全相同的方式处理-从程序员的角度来看,为PK和索引使用单独的代码路径是没有意义的(它将使潜在的错误)。

除了被外键引用外,PK只是一个唯一的约束,该约束又实现为索引,因此更改PK的属性与更改任何其他索引的属性相同。同样具有明确的名称意味着可以像其他任何索引一样在查询提示中引用它们。


1
是的,这也意味着可以更改用作PK的列。因此,对于书籍,您可以将ISBN用作PK(为了清楚起见,您可以将其称为ISBN),但是在开发过程的一半,您可能会决定也可以库存二手书,这意味着您需要单独的记录(例如,头顶上的例子)。因此,您需要将PK字段更改为一些唯一的ID。
内森·麦金尼斯

1
我更喜欢这样说:“ PK是使用索引的约束”。有时,两个约束(一个PK和一个FK-或2个FK)可以使用相同的索引。
ypercubeᵀᴹ

@ypercube我更喜欢“ PK是在99.99%的实际数据库中使用索引的约束”,这当然意味着可以在没有索引的情况下使用PK约束,但是没有人打算在其中使用该数据库。由于性能原因,现实世界将永远实现它。
Pacerier

6

不确定我是否完全理解这个问题。

如果您在表上有一个索引,并且想要/需要更改索引,是否还不需要根据其名称进行更改?我想您可以查找索引的objectID并以这种方式进行更新,但是名称可以帮助人们从逻辑上了解他们正在使用的对象。

因此,答案可能是,如果您使用的是强命名约定(即,主键为name_PK),那么您将能够轻松识别出您正在使用表的主键。

我想对于定义FK关系也可以说同样的话。我认为使用名称是为了逻辑解释,因为对象本身都具有不同的objectID。


5

我会说这是人类可读性的实现细节。

约束名称是可选的(至少在SQL Server中),但我希望使用PK_MyTablefor MyTable而不是PK_MyTabl___16feb6d8a


3

从历史上看,主键和唯一键都被称为候选键,如Christopher J. Date所教。

候选键是唯一的索引,可以播放主键。因此,所有候选键都是唯一键。主键只是将候选键之一指定为访问表数据的首选方式。

鉴于此,名称PRIMARY KEY是作为表属性附加的首选候选键的任意名称。只能有一个主键。

实际上,仅创建命名的候选键就足够了。

要将索引从聚集索引更改为非聚集索引,然后再返回,将只是找到PRIMARY KEY(定义为最多1)的一种做法。我猜您可以说,拥有PRIMARY KEY定义本质上是对数据库纯粹主义者的怀旧之情。这种数据库的纯净度应该使用关键字CANDIDATE KEY而不是实际的单词UNIQUE KEY来调用唯一键。

单击此处查看候选关键字的定义和CJDate对此的评论


1

没有什么可以说主键将代表表对象。表对象是聚集索引,而不是主键。没有什么可以说主键必须与聚簇索引相同。通常是这样,但不一定如此。非聚集索引可以很容易地实施主键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.