2009-05-25 65 views

回答

8

看到这个MSDN article

数据库引擎会自动 创建唯一索引来强制UNIQUE 约束的 唯一性要求。

如果你创建一个索引,你会拥有两个指标,因为这个例子演示:

create table TestTable (id int) 
alter table TestTable add constraint unique_id unique (id) 
create unique index ix_TestTable_id on TestTable (id) 

select * from sys.indexes where [object_id] = object_id('TestTable') 

这将在TestTable的显示两个唯一索引;和代表表格本身的HEAP。

1

当您添加唯一约束创建索引:

Reference - 见第二段。

当一个UNIQUE限制添加到 在 表中现有列或多列,默认情况下,数据库引擎 检查该 列中的现有数据,以确保所有值都 独特。如果将一个唯一约束 添加到重复值为 的列中,那么数据库引擎将返回一个 错误并且不会添加约束。

数据库引擎自动创建一个UNIQUE索引,以强制执行UNIQUE 约束的 唯一性要求。因此,如果尝试执行 来插入重复行,则 数据库引擎会返回错误 消息,指出违反了UNIQUE 约束条件,并且 不会将该行添加到表中。除非指定 聚簇索引明确指定为 ,否则默认情况下会创建唯一的非聚簇 索引以强制使用UNIQUE约束 。

2

是的,它的确如此。

事实上,你甚至可以创建一个CLUSTERED UNIQUE CONSTRAINT

ALTER TABLE mytable ADD CONSTRAINT UX_mytable_col1 UNIQUE CLUSTERED (col1) 

,这将使要在col1聚集表。

几乎所有数据库都会为UNIQUE CONSTRAINT创建一个索引,否则很难维护它。

Oracle甚至没有区分UNIQUE CONSTRAINTUNIQUE INDEX:一个命令只是另一个命令的同义词。

Oracle唯一的区别是,UNIQUE INDEX应该有一个用户提供的名称,而一个UNIQUE CONSTRAINT可以与系统生成的名称来创建:

ALTER TABLE mytable MODIFY col1 UNIQUE 

这将创建称为SYS_CXXXXXX的索引。

+1

当您使某一列唯一时,如果该列已被编入索引,Oracle将不会创建唯一索引 - 因为它可以使用非唯一索引警告唯一约束(尽管通常不建议这样做)。 – 2009-05-26 02:02:22

相关问题