--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显示我没有任何约束,但有一个键+索引,而上下文选项(右键单击)提示我创建(抱歉,脚本)仍然约束。
主要问题:
什么是关键?
为什么需要这种约束?
为什么键调用唯一约束(和唯一约束键调用)?
对不起,为什么键被索引调用?它们似乎具有相同的名称(虽然我创建时没有明确的名称,但它们会以不同的方式调用)...
对不起,再次......
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);
产生:
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个人“候选人”
注意:如果通过单独的T-SQL语句和自定义/手动名称创建唯一约束(如我在顶部所做的那样),则脚本编写不会产生匿名DML,并且它们的执行分别不允许“候选”的乘法“
主键的奇怪候选人,不是吗?需要访问缩小(具有多个身份症状)?
答案 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)