当我希望一列具有不同的值时,我可以使用约束
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
从数学的角度来看,假设一个表最多有一个主键,通过任意名称而不是简单的表属性来引用主键似乎是一种短视的设计决定。
因此,要将主键从非集群更改为集群,反之亦然,您必须首先搜索其名称,而不是删除它并最终读取它。
使用我看不到的任意名称是否有一些优势,或者 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 中的名称必须是唯一的。对表及其主键使用完全相同的名称是完全可以的。
这样做,我们不需要设置命名约定,这可能会被意外违反。
现在回答玛丽安: