2010-10-20 85 views
4

在SQL Server Management Studio中(SSMS)2008 R2开发在桌子上(因为我不能要求没有它)约束是关键是索引是约束?

--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

主要问题:
什么是这里的关键?
为什么需要这个约束?
为什么通过键调用唯一约束(并通过唯一约束键)?
对不起,为什么按索引调用密钥?他们似乎有相同的名称(虽然我有没有明确的名称创建的,他们会叫不同的)...
对不起,再...

抵押品问题:
哪些功能是“唯一约束”之间的不同与“唯一索引”?今天我搜索了一个不同的时间(想找到10),而且找不到任何东西。
换句话说,什么是(为什么)概念(或构造)“唯一约束”和“唯一索引”在SQL Server中是重复的?

奖金的问题(对于那些谁这个问题似乎太简单了):
什么意义上唯一索引(或唯一约束)允许易受骗的人?

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

更新: 对不起 谢谢,伙计们和女士(奖金被撤回)
UPDATE2:是不存在(“唯一索引”和以前的SQL Server中的“唯一约束”之间的区别我隐约记得其中一个不允许NULL)?
Update3:真的,我总是生气(困惑)的一个“外键约束”被称为“外键”,而它不是一个键和关键,外国人在另一个表,外国人......只是发现这是普遍的混乱。至少,现在我记住我应该记住au contraire。

UPDATE4:
@Damien_The_Unbeliever,谢谢,
这些,至少,一些hrooks记忆混乱。

虽然有些困惑:
为什么这些候选项默认不是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名受骗者,
执行一次 - 瞧:3重复数据删除“候选人”
alt text

注:如果创建由单独的T-唯一约束SQL语句与自定义/手动名称,因为我在顶部,然后脚本不产生匿​​名DML,并分别,他们的执行不允许乘“候选人”

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

+1

RE:最后一句 - 它不允许使用。 'IGNORE_DUP_KEY = ON'意味着不会插入模糊,但不会引发错误。 – 2010-10-20 14:08:12

回答

8

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

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

UNIQUE约束与PRIMARY KEY类似 - 它们可以是FOREIGN KEY约束的目标引用。独立索引本身不能被如此引用。

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

+0

我不能说我理解,除了在我看来,作为我标记的解释和答案 – 2010-10-26 05:23:17

2

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

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

SSMS在它的表现方式上有些混乱。不知道为什么

就我个人而言,我认为IGNORE_DUP_KEY是毫无意义的,从来没有使用它。

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

ON 发出警告消息,并且 只有违反唯一 索引的行失败。

OFF 的发布错误消息和 整个INSERT事务将被 回来。

IGNORE_DUP_KEY设置仅应用 来插入创建或重建索引后发生的操作 。 在 索引操作中,该设置没有影响。

编辑:

+0

>>就我个人而言,我认为IGNORE_DUP_KEY是毫无意义的,从未使用它。这是非常有用的,当牺牲大文件,你不希望它失败在最后一行,如果你有一个dup – SQLMenace 2010-10-20 14:11:55

+0

@SQLMenace:我会使用约束精简登台表擦除和验证/解码数据那种情况。如果必须报告的话。 *特别是*如果该文件预计无副作用。 – gbn 2010-10-20 14:13:53

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) 
3

这只你的问题的答案的一部分,因为我不是为什么Management Studio中显示这些对象它的方式明确。

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

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

SQL Server使用唯一索引来实现唯一约束。有一个逻辑上的区别,我认为这在SQL Server图表工具中出现 - 如果您对外键使用唯一的约束,否则将是1:n关系,它将显示为1:1。当使用唯一索引时(这不是100%肯定)。