我想防止在我的表中插入重复值。起初,我添加了代码来检查该值是否已经存在于数据库中,但是如果我可以在 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 没有内置选项(我知道)可以忽略此类错误。解决方法是重写insert
withnot 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] 删除。
我来说两句