从数学的角度来看,假设一个表最多有一个主键,通过任意名称而不是简单的表属性来引用主键似乎是一种短视的设计决定。
因此,要将主键从非集群更改为集群,反之亦然,您必须首先搜索其名称,而不是删除它并最终读取它。
使用我看不到的任意名称是否有一些优势,或者 DBMS 是否不使用任意名称作为主键?
编辑 2011-02-22 (对于那些不想在那里排序的人,2011 年 2 月 22 日):
让我展示一个函数,您可以使用它从表名中导出主键的名称(使用早期的 sql-sever 又名 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
Run Code Online (Sandbox Code Playgroud)
正如 gbn 所说,当您不提供明确的名称时,没有人真正喜欢生成的名称:
create table example_table (
id int primary key
)
select dbo.get_pk('example_table')
Run Code Online (Sandbox Code Playgroud)
我刚得到
PK__example___3213E83F527E2E1D
Run Code Online (Sandbox Code Playgroud)
但是为什么 sysobjects 中的名称必须是唯一的。对表及其主键使用完全相同的名称是完全可以的。
这样做,我们不需要设置命名约定,这可能会被意外违反。
现在回答玛丽安:
Dav*_*ett 17
主键(和其他唯一约束)作为索引实现,并以完全相同的方式处理 - 从程序员的角度来看,为 PK 和索引设置单独的代码路径是没有意义的(它会使潜在的错误)。
除了被外键引用外,PK 只是一个唯一的约束,它反过来实现为一个索引,因此更改 PK 的属性与更改任何其他索引的属性相同。还具有显式名称意味着它们可以像任何其他索引一样在查询提示中被引用。
不确定我是否完全理解这个问题。
如果您在表上有一个索引并且您想要/需要更改该索引,您是否也不需要根据它的名称更改它?我想您可以查找索引的 objectID 并以这种方式进行更新,但名称往往有助于人们从逻辑上理解他们正在使用的对象。
因此,也许答案是,如果您使用了强命名约定(即,主键的 name_PK),那么您将能够轻松识别您正在使用表的主键。
我想同样的事情也可以用于定义 FK 关系。我认为名称的使用是为了逻辑解释,因为对象本身都有不同的对象 ID。
我会说这是人类可读性的实现细节。
约束名称是可选的(至少在 SQL Server 中),但我想要PK_MyTable
forMyTable
而不是PK_MyTabl___16feb6d8a
归档时间: |
|
查看次数: |
3139 次 |
最近记录: |