索引类型的索引/键唯一的Vs索引/类型唯一键的键

时间:2013-12-19 17:34:03

标签: sql database-design sql-server-2008-r2

我正在使用sql server 2008 r2。我有以下内容: -

  1. 索引类型的索引/键是唯一的。
  2. 类型唯一键的索引/键。
  3. 两者之间是否有任何差异。我的意思是在列上有一个唯一的键,或者在同一列上有一个唯一的索引?

    谢谢

1 个答案:

答案 0 :(得分:2)

这是一个渐进的概念列表,应该有助于清理问题:

  • 逻辑级别:
    • “密钥” - 包含表格中所有行的唯一值的列(或列组合)。
    • 表中的所有键在逻辑上都是等价的,但出于实际和历史原因,我们选择其中一个为“primary”,其余为“alternate”。主键由PRIMARY KEY约束表示,备用键是UNIQUE约束。
    • 所有密钥都是唯一的,因此说“唯一密钥”是多余的。
    • 通过限制哪些数据被视为有效来改变数据的含义。
  • 物理等级:
    • “索引”是一种物理结构(通常是B-Tree),它改变了数据库的性能特征,但(与密钥不同)并不是要改变数据的含义(但请参见唯一)以下索引)。
    • 键不是索引,索引不是键,虽然它们通常出于性能原因而一起使用 1
    • 主键下方的索引称为“主索引”,其余索引为“secondary”
    • 索引可以是唯一的也可以是非唯一的,但物理结构略有不同。
    • 如果整个表存储在B树内(而不是B-Tree和表堆的组合),则这种B-Tree称为“聚集索引”。在MS SQL Server下,除非指定NONCLUSTERED,否则PRIMARY KEY默认为聚簇索引。 MS SQL Server还允许您定义与主键不同的聚簇索引(与大多数其他DBMS不同)。有关群集的更多信息,请参阅here
    • 外键不是键,只是引用键。

独特的索引在这里是一个古怪的,应该被视为一个特例。如果往往比非唯一索引略窄,并且通常用于强制执行密钥。然而,它也可以在没有密钥的情况下使用,在这种情况下,它可能表现得或多或少相似,就好像它有一把钥匙一样。有多相似,取决于DBMS 2

所以回答你的问题:在MS SQL Server下,有或没有UNIQUE约束的唯一索引在实践中非常相似,但你仍然应该将它们视为单独的概念。我使用UNIQUE约束(在其下面有唯一索引)作为默认值,使其更加自我记录并与其他DBMS的工作方式保持一致。


1 DBMS经常强制或至少默认为每个键下面的索引。但情况并非总是如此 - 例如,Oracle将允许没有索引的密钥或具有非唯一索引的密钥(它甚至需要非延迟密钥的非唯一索引)。

2 在MS SQL Server下,它非常相似。例如,在Oracle下,您无法从FOREIGN KEY引用唯一索引,您必须引用正确的密钥。