在sqlservermanagementstudio(SSMS)2008 R2 Dev表中(因为没有它我无法请求)

--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显示我没有任何约束,而是有一个key+索引,而上下文选项(右键单击)提示我创建(对不起,脚本)仍然是约束。

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中的“unique index”和“unique constraint”之间没有区别吗(我隐约记得其中一个不允许NULL)?

更新4:
@不信的达米安
这些,至少是一些记忆混乱的书。

不过,有些困惑:
为什么这些候选项在默认情况下不为空?

CREATE TABLE A(A INT UNIQUE);  

产生了:
alt text

WTF这个“候选者”的主键有 多重身份综合征 ,那么呢?
“UQ”不代表命名实践中的唯一约束吗?

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

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]

密钥的脚本生成相同的结果!再说一次,约束。。。 为什么没有名字?为什么不可能把脚本写成“修改”,而只能写成“创建”?!
这没道理!

如果要执行生成的脚本,有两个重复,

alt text

注意:如果要像我在顶部所做的那样,通过使用自定义/手动名称的单独T-SQL语句创建唯一约束,那么脚本不会生成匿名DML,并且它们的执行不允许“候选”的乘法运算

奇怪的主键候选人,不是吗?需要去看心理医生(有多种症状)?

4 回复  |  直到 12 年前
    1
  •  8
  •   Damien_The_Unbeliever    14 年前

    唯一约束也称为唯一键约束。基本上,一个表可以有多个键。其中一个被选择(有些随意)作为表的主键。其他键被创建为唯一键约束。

    唯一约束类似于主键-它们可以是外键约束的目标引用。唯一索引本身不能被这样引用。

    在SSMS中,主键、唯一键和外键约束始终显示在表的“Keys”文件夹下。复选框和默认约束将显示在“约束”文件夹下

        2
  •  3
  •   Phil Sandler    14 年前

    唯一约束是(逻辑)关系模型的一部分。实际上,如果绘制逻辑模型,图形上将显示唯一约束。

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

        3
  •  2
  •   SQLMenace    14 年前

    首先,你的桌子只有一个值而不是三个,看看

    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
    

    一排,对吧? 这是因为您使用了(忽略重复键=开)

    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)
    
        4
  •  2
  •   Community CDub    7 年前

    显式创建索引和通过ALTER TABLE添加约束之间的唯一区别就是能够将列包含为显式索引。

    SSMS在如何表示这一点上有些混乱。不知道为什么

    就我个人而言,我认为忽略重复键是没有意义的,而且从未使用过它。

    指定错误响应 在多行中重复键值 或唯一的非聚集索引。这个

    打开 发出警告消息并 只有违反唯一性的行 索引失败。

    关闭 发出错误消息,并且 整个插入事务已滚动

    应用忽略重复键设置 在创建或重建索引之后。 设置在

    编辑: