SQL Server 2008上的唯一键与唯一索引
我有一个名为countries
的表,我通过在SQL Server 2008 R2上创buildtypes为“唯一键”的“索引/键”来将country_name
列定义为唯一的。
但是我有以下问题:
- 将创build“唯一键”types的“索引/键”自动创build此列上的非聚集索引?
- 如果将types从“唯一键”更改为“索引”,并将
IsUnique
值保持为“是”,那么会有什么区别吗? - 所以为什么有两个选项“独特的钥匙”和“指数”,我认为这两个是相同的?
一个唯一的约束是作为一个唯一索引在后台实现的,所以你怎么指定它并不重要。 我倾向于将其实现为:
ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar);
有些人创build一个唯一的索引,例如
CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar);
不同之处在于意图 – 如果创build约束来执行唯一性/业务规则,则创build一个约束,如果这样做是为了帮助查询性能,则创build唯一索引可能更合乎逻辑。 再一次,在封面下是相同的实现,但你走的路可能有助于logging你的意图。
我认为有多种select可以遵循先前的Sybasefunction以及坚持ANSI标准(即使唯一约束不符合标准的100%,因为它们只允许一个NULL值 – 一个唯一的索引,另一方面,可以通过在SQL Server 2008和更高版本上添加WHERE
子句( WHERE col IS NOT NULL
)来解决此问题。
还有一件要提到的是,如果你创build索引,你可以指定包含的列,这可以帮助你的SQL代码更快地工作,如果有一些country_namesearch。
CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar ON dbo.foo ( bar ) INCLUDE (foo_other_column) GO SELECT foo_other_column FROM Foo WHERE bar = 'test'
SQL服务器将在索引本身中存储“foo_other_column”。 在唯一约束的情况下,它将首先find'testing'的索引,然后将在foo表中search行,只有在那里它将采取“foo_other_column”。