相关疑难解决方法(0)

什么时候应该使用唯一约束而不是唯一索引?

当我希望一列具有不同的值时,我可以使用约束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
Run Code Online (Sandbox Code Playgroud)

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);
Run Code Online (Sandbox Code Playgroud)

具有唯一约束的列似乎是唯一索引的良好候选者。

是否有任何已知的原因使用唯一约束而不是使用唯一索引?

index sql-server constraint best-practices unique-constraint

238
推荐指数
4
解决办法
11万
查看次数

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

从数学的角度来看,假设一个表最多有一个主键,通过任意名称而不是简单的表属性来引用主键似乎是一种短视的设计决定。

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

使用我看不到的任意名称是否有一些优势,或者 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 中的名称必须是唯一的。对表及其主键使用完全相同的名称是完全可以的。

这样做,我们不需要设置命名约定,这可能会被意外违反。

现在回答玛丽安:

  1. 我仅使用将集群主键更改为非集群主键的任务作为示例,我需要知道 pk 的实际名称才能删除它。
  2. 事物不需要有专有名称,如果它们可以很容易地唯一表示就足够了。这就是抽象的基础。面向对象编程就是这样。您不需要为不同类的相似属性 …

primary-key

19
推荐指数
3
解决办法
3139
查看次数