是否使列独一无二强制创建索引?
答
看到这个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。
答
当您添加唯一约束创建索引:
Reference - 见第二段。
当一个UNIQUE限制添加到 在 表中现有列或多列,默认情况下,数据库引擎 检查该 列中的现有数据,以确保所有值都 独特。如果将一个唯一约束 添加到重复值为 的列中,那么数据库引擎将返回一个 错误并且不会添加约束。
数据库引擎自动创建一个UNIQUE索引,以强制执行UNIQUE 约束的 唯一性要求。因此,如果尝试执行 来插入重复行,则 数据库引擎会返回错误 消息,指出违反了UNIQUE 约束条件,并且 不会将该行添加到表中。除非指定 聚簇索引明确指定为 ,否则默认情况下会创建唯一的非聚簇 索引以强制使用UNIQUE约束 。
答
是的,它的确如此。
事实上,你甚至可以创建一个CLUSTERED UNIQUE CONSTRAINT
:
ALTER TABLE mytable ADD CONSTRAINT UX_mytable_col1 UNIQUE CLUSTERED (col1)
,这将使要在col1
聚集表。
几乎所有数据库都会为UNIQUE CONSTRAINT
创建一个索引,否则很难维护它。
Oracle
甚至没有区分UNIQUE CONSTRAINT
和UNIQUE INDEX
:一个命令只是另一个命令的同义词。
在Oracle
唯一的区别是,UNIQUE INDEX
应该有一个用户提供的名称,而一个UNIQUE CONSTRAINT
可以与系统生成的名称来创建:
ALTER TABLE mytable MODIFY col1 UNIQUE
这将创建称为SYS_CXXXXXX
的索引。
当您使某一列唯一时,如果该列已被编入索引,Oracle将不会创建唯一索引 - 因为它可以使用非唯一索引警告唯一约束(尽管通常不建议这样做)。 – 2009-05-26 02:02:22