SQL Server 唯一约束是“静默”还是会引发异常?

B. 克莱香农

我想防止在我的表中插入重复值。起初,我添加了代码来检查该值是否已经存在于数据库中,但是如果我可以在 DDL 级别阻止它,这似乎是很多开销/浪费时间。

所以我找到了这个并从这个改变了我的一个表(作为例子):

CREATE TABLE [dbo].[ACTORS] 
(
    [Id]      INT IDENTITY (1, 1) NOT NULL,
    [ActorId] CHAR(9)     NOT NULL,
    [Actor]   VARCHAR(50) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),
);

对此:

CREATE TABLE [dbo].[ACTORS] 
(
    [Id]      INT IDENTITY (1, 1) NOT NULL,
    [ActorId] CHAR(9)     NOT NULL,
    [Actor]   VARCHAR(50) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),

    CONSTRAINT [CK_ACTORS_Column] 
        UNIQUE NONCLUSTERED ([ActorId] ASC)
);

我希望约束可以防止第二个相同,ActorId而无需抱怨[g]。IOW,绕过它,不要告诉我它,不要停止应用程序或抛出异常。

这是它的工作方式(静默),还是会抛出异常?

专卖店

让我们试试:

insert into actors (actorid,actor) values('foo', 'bar');
-- 1 row affected

insert into actors (actorid, actor) values('foo', 'baz');
-- Msg 2627 Level 14 State 1 Line 1
-- Violation of UNIQUE KEY constraint 'CK_ACTORS_Column'. 
-- Cannot insert duplicate key in object 'dbo.ACTORS'. The duplicate key value is (foo      ).

唯一约束违规确实会引发错误。这就是数据库让您知道出现问题的方式。

与许多其他数据库(MySQL、Postgres、SQLite...)不同,SQL Server 没有内置选项(我知道)可以忽略此类错误。解决方法是重写insertwithnot exists和子查询:

insert into actors (actorid, actor)
select v.*
from (values ('foo', 'bar')) v(actorid, actor)
where not exists (select 1 from actor a where a.actorid = v.actorid)

另一种选择是merge声明:

merge into actors a
using (values ('foo', 'bar')) v(actorid, actor)
on v.actorid = a.actorid
when not matched then insert (actorid, actor)
values (v.actorid, v.actor)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章