SQL中使用UNIQUE Constraint还是Unique Index?

李万明2014

李万明2014

2016-02-19 16:03

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐SQL中使用UNIQUE Constraint还是Unique Index?,希望大家看完后也有个好心情,快快行动吧!

  问题:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  当我需要在表格中增加一个必须被唯一定义的柱状表时,发现SQL Server允许在一个柱状表上定义一个UNIQUE constraint。但是我也可以在柱状表上创造一个Unique Index。哪一个是我应该使用的?

  专家解答:

  这两种方法之间的不同是很微妙的,UNIQUE constraints是ANSI SQL定义的一部分,定义UNIQUE constraints是数据库逻辑定义的一部分。另外,UNIQUE constraints作为一个副产品可以作为表格定义的一部分被创造,当约束被创造时SQL Server将自动的在搜索引擎下创造一个Unique Index。相反的,定义Unique Index是设计物理数据模型的一部分,他们不是ANSI标准。

  从性能立场上,UNIQUE constraints 和 unique indexes对最优化查询同样有效,这两个在使用过程中,你不会觉得其中一个比另一个更有效。在我看来,我坚持ANSI标准,通过约束实现柱体唯一性。在我看来UNIQUE constraints在更好的证明一个表格时有用,我使用它们超过unique indexes

  在一个Management Studio连接中,运行下列的程序去创造一个表格被叫做CAR。表格基于它的构成和模型定义一个UNIQUE constraint在CAR上。

  CREATETABLEdbo.CAR
  (
  CARIDINTIDENTITY(1,1)NOTNULL,
  MAKEVARCHAR(10)NOTNULL,
  MODELVARCHAR(10)NOTNULL,
  TOTALDOORSTINYINTNOTNULL,
  TOTALCYLINDERSTINYINTNOTNULL,
  CONSTRAINTPK_CARPRIMARYKEYNONCLUSTERED(CARID),
  CONSTRAINTUQ_CARUNIQUENONCLUSTERED(MAKE,MODEL)
  )
  GO

  运行SP_HELP CAR显示,the engine已经创造了包括这个约束和一个索引支持在内。

图一:运行SP_HELP CAR

  一个要求出现在我的桌面上。以报告为目的,管理想要通过year made跟踪cars,另外,对结构和模型。我们将改变这个表格使之包含一个年柱。

  ALTERTABLEDBO.CAR
  ADD[YEAR]SMALLINT
  GO

  增加这个柱体要求我去改变约束的唯一性,否则,我将无法通过结构和模型而不管年柱增加比一个多的car。另外,不允许通过结构,模型和年柱复制cars可能是一个好的主意。结果是我将重新创作这个约束的Unique Index去包含年柱。

  DROPINDEXDBO.CAR.UQ_CAR
  GO
  CREATEUNIQUEINDEXUQ_CARONDBO.CAR(MAKE,MODEL,[YEAR])
  GO

  运行上方的代码,你将看见随后的错误提示:

图二:错误提示

  伙计,这个看起来丑陋吧。DROP失败是因为约束依靠索引,它必须匹配约束的定义。在我们的例子中去改变唯一性,我们可以先drop然后重复增加约束。

  ALTERTABLEDBO.CAR
  DROPCONSTRAINTUQ_CAR
  GO
  ALTERTABLEDBO.CAR
  ADDCONSTRAINTUQ_CARUNIQUE(MAKE,MODEL,[YEAR])
  GO

  重新运行SP_HELP CAR,显示有改变在进行。

图三:第二次运行SP_HELP CAR

  我刚刚注意到在表格上没有clustered index。自从我们的所有报告将按照结构,模型和年柱分类,我就想将unique constraint转化为clustered index。同时你又可以DROP 以及 CREATE这个约束使它成为UNIQUE CLUSTERED,实际上你也可以使用CREATE INDEX使用DROP_EXISTING选项。自从约束的约束匙不再改变,SQL Server engine 将允许你去发行下列的的声明,将UNIQUE constraint改变为clustered。

  CREATEUNIQUECLUSTEREDINDEXUQ_CARONDBO.CAR(MAKE,MODEL,[YEAR])
  WITHDROP_EXISTING
  GO

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  再次运行SP_HELP CAR显示constraint's index被改变成clustered index

图四:第三次运行SP_HELP CAR

展开更多 50%)
分享

猜你喜欢

SQL中使用UNIQUE Constraint还是Unique Index?

编程语言 网络编程
SQL中使用UNIQUE Constraint还是Unique Index?

Nugget Unique平面广告欣赏

平面设计 海报设计 广告设计 画报设计 签名设计 服装设计 名片设计 画册设计 版式设计 商标设计
Nugget Unique平面广告欣赏

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ACCESS中使用SQL语句

编程语言 网络编程
ACCESS中使用SQL语句

在SQL Server 中使用SQLDMO

SQLServer
在SQL Server 中使用SQLDMO

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

ASP中使用SQL语句教程

ASP
ASP中使用SQL语句教程

VB中使用SQL查询语句

编程语言 网络编程
VB中使用SQL查询语句

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

SQL Server BI Step by Step 1 --- 准备

SQL Server BI Step by Step 1 --- 准备

jquery 获取当前元素的索引值

jquery 获取当前元素的索引值
下拉加载更多内容 ↓