SQL中使用UNIQUE Constraint还是Unique Index?

2016-02-19 16:03 1 1 收藏

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

【 tulaoshi.com - 编程语言 】

  问题:

  当我需要在表格中增加一个必须被唯一定义的柱状表时,发现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

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

  运行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,显示有改变在进行。

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

图三:第二次运行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

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

图四:第三次运行SP_HELP CAR

来源:https://www.tulaoshi.com/n/20160219/1610956.html

延伸阅读
标签: ASP
确定数据库内有多少记录,或者确定有多少记录达到了某些标准,这些用ASP完成并非难事。如果你采用了正确的游标类型,你可以用RecordCount 属性获得记录数当然也可以用recordset。但是,有个更简单的办法,这就是在自己的SELECT语句中采用count(*) ,代码如下所示: SQL = "SELECT count(*) FROM Customers" 或者 SQL = "SELECT count(*) FROM...
标签: ASP
五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用自己掌握的Access知识以及相应的Access技能,再加上我们的提示和技巧,相信一定能成功地在你的ASP网页中加入SQ...
标签: ASP
我们到目前为止所谈到的SQL语句相对较为简单,如果再能通过标准的recordset循环查询,那么这些语句也能满足一些更复杂的要求。不过,何必非要拘泥在浅尝则止的基础水准之上呢?你完全可以再增加其他一些符号,比如AND、 OR和NOT来完成更强大的功能。 以下面的SQL语句为例: SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WH...
标签: ASP
在学会了SELECT语句的构造和用途之后你就该学习如何使用它了。在你所掌握的数据库工具下,这可能意味着你得按下某个写着“执行”字样的按钮。在ASP网页上,可以立即执行SQL语句也可以当作存储过程调用。 一旦创建了SQL 语句,你还得设法访问其查询结果。显然,这里的关键就是ASP recordset。在使用非SQL的recordset时,创建recordset的代码通...
标签: ASP
从某个页面表单中取出信息是ASP编程中常见的问题。但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小。简单的GUI界面都可能令循环遍历操作耗费太多的时间。 比方说,假设有个团队成员登录到GUI屏幕输入自己的名字姓氏和名字之间用点号连接:amy.cowen。这个值通过表单提交,她的当前项目列表就从数据库中取了出来并显示在...

经验教程

877

收藏

18
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部