约束是关键是索引是约束吗?

时间:2010-10-20 14:02:56

标签: sql sql-server database indexing

SQL Server Management Studio(SSMS)2008 R2 Dev on the table(因为没有它我不能问)

--SET ANSI_NULL_DFLT_ON ON
create table B (Id int)

我创建了唯一约束

ALTER TABLE B
ADD CONSTRAINT IX_B
UNIQUE (ID)
WITH (IGNORE_DUP_KEY = ON)

SSMS显示我没有任何约束,但有一个键+索引,而上下文选项(右键单击)提示我创建(抱歉,脚本)仍然约束。

alt text alt text

主要问题:
什么是关键?
为什么需要这种约束?
为什么键调用唯一约束(和唯一约束键调用)?
对不起,为什么键被索引调用?它们似乎具有相同的名称(虽然我创建时没有明确的名称,但它们会以不同的方式调用)... 对不起,再次......

COLLATERAL问题:
“唯一约束”与“唯一索引”之间的哪些功能不同?我今天搜索了一个单一的差异(想要找到10)很长一段时间,找不到任何 换句话说,什么是(为什么)概念(或构造)“唯一约束”和“唯一索引”在SQL Server中重复?

奖金问题(对于那些这个问题似乎过于简单的人):
允许欺骗的独特指数(或唯一约束)的意义是什么?

<击>
insert into B VALUES (1)
insert into B VALUES (1)
insert into B VALUES (1)

<击> 更新:<罢工>抱歉谢谢,男女老少(奖金被撤回)
Update2:以前的SQL Server中“唯一索引”和“唯一约束”之间没有区别(我模糊地回忆起其中一个不允许NULL)?
更新3:真的,我总是生气(困惑)“外键约束”被“外键”调用,而它不是键和钥匙,外国人在另一张表中,外国人......而且只是发现这是普遍的混乱,对它发出嘎嘎声。至少,现在我记住我应该记得他的对手。

UPDATE4:
@Damien_The_Unbeliever ,谢谢,
这些至少是一些记忆混乱的小事。

虽然,有些困惑:
为什么这些候选者默认不是NULL?

最初我真的想插入更短的脚本:

CREATE TABLE A(A INT UNIQUE);  

产生:
alt text

WTF这个PRIMARY和KEY的“候选人”有多重身份证明,然后呢? “UQ_”代表命名实践中的唯一约束吗?

现在,这个索引的脚本UQ__A__3214EC262AA05119产生无名...而不是索引...约束(?!):

ALTER TABLE [dbo].[A] ADD UNIQUE NONCLUSTERED 
(
    [ID] ASC
)
WITH 
(    PAD_INDEX  = OFF, 
     STATISTICS_NORECOMPUTE  = OFF, 
     SORT_IN_TEMPDB = OFF,
     IGNORE_DUP_KEY = OFF,
     ONLINE = OFF,
     ALLOW_ROW_LOCKS  = ON,
     ALLOW_PAGE_LOCKS  = ON) 
ON 
[PRIMARY]

WTheF - 如何将唯一索引标识为约束?在哪里,通过什么

密钥的脚本产生相同的!约束...... 它为什么无名?为什么不能将脚本编辑为“修改”而只能作为“创建”?!
这根本不符合逻辑!

现在如果要执行生成的脚本,则有2个dupes,
再次执行 - 瞧:3个人“候选人” alt text

注意:如果通过单独的T-SQL语句和自定义/手动名称创建唯一约束(如我在顶部所做的那样),则脚本编写不会产生匿名DML,并且它们的执行分别不允许“候选”的乘法“

主键的奇怪候选人,不是吗?需要访问缩小(具有多个身份症状)?

4 个答案:

答案 0 :(得分:8)

UNIQUE约束也称为UNIQUE KEY约束。基本上,表可以有多个KEY。选择一个(有点任意)作为表的主键。其他键创建为UNIQUE KEY约束。

作为实现细节,通过在表中的相同列上放置UNIQUE索引来实现UNIQUE KEY约束。但是,可以在表上创建UNIQUE索引(通过CREATE INDEX),而不创建UNIQUE约束。

UNIQUE约束与PRIMARY KEY类似 - 它们可以是FOREIGN KEY约束的目标引用。单独的UNIQUE索引不能这样引用。

在SSMS中,PRIMARY KEY,UNIQUE和FOREIGN KEY约束将始终显示在表的“Keys”文件夹下。 CHECK和DEFAULT约束将显示在“Constraints”文件夹下

答案 1 :(得分:3)

这只回答了你问题的一部分,因为我不清楚为什么管理工作室会以这样的方式显示这些对象。

唯一约束是(逻辑)关系模型的一部分。基本上,如果您要绘制逻辑模型,则图形上会出现一个唯一约束。

唯一索引(与所有索引一样)是一个实现细节,因此是物理模型的一部分。

SQL Server使用唯一索引来实现唯一约束。存在逻辑差异,我认为这会出现在SQL Server图表工具中 - 如果您对外键使用唯一约束,否则它将是1:n关系,它将显示为1:1。使用唯一索引时不是这样(再次,不是100%肯定)。

答案 2 :(得分:2)

唯一约束在内部实现为索引。

显式CREATE INDEX和通过ALTER TABLE添加约束之间的唯一区别是能够将INCLUDE列作为显式索引。

SSMS在如何呈现这一点时有点令人困惑。不知道为什么

就个人而言,我认为IGNORE_DUP_KEY毫无意义,从未使用过它。

  

指定对的错误响应   多行中的重复键值   在唯一的集群上插入操作   或唯一的非聚集索引。该   默认为OFF。

     

在   发出警告信息   只有违反唯一的行   索引失败。

     

OFF   发出错误消息并且   滚动整个INSERT事务   回来。

     

IGNORE_DUP_KEY设置适用   仅插入发生的操作   创建或重建索引后。   该设置在期间没有影响   指数操作。

编辑:

答案 3 :(得分:2)

首先关闭所有表只有1个值而不是3,看看

create table B (Id int)


ALTER TABLE B
ADD CONSTRAINT IX_B
UNIQUE (ID)
WITH (IGNORE_DUP_KEY = ON)

insert into B VALUES (1)
insert into B VALUES (1)
insert into B VALUES (1)

- 忽略了重复的密钥 - 忽略了重复键。

select * from B

一排,对吗? 这是因为你有这个WITH(IGNORE_DUP_KEY = ON)

现在这样做

create table C (Id int)


ALTER TABLE C
ADD CONSTRAINT IX_C
UNIQUE (ID)


insert into C VALUES (1)
insert into C VALUES (1)

第二行不会立即进入表格

SQL Server实现约束的方式是它在其后面创建一个索引以便于快速查找。 也许你真的想要这张桌子上的主键?

create table D (Id int not null primary key)