Sql server 2012 如果记录违反约束,则在插入时自动删除记录

Sql server 2012 如果记录违反约束,则在插入时自动删除记录,sql-server-2012,Sql Server 2012,我想设置一个带有约束的表,但是当我插入记录时,我不想得到任何违反约束的错误。我想让SQL悄悄地删除所有非唯一的记录,但继续插入那些可以插入的记录 例如 create table table1 (value1 int, value2 int, constraint uc_tab1 Unique (value1,value2) ) create table table2 (value1 int, value2 int ) insert into table2 (value1,value2) se

我想设置一个带有约束的表,但是当我插入记录时,我不想得到任何违反约束的错误。我想让SQL悄悄地删除所有非唯一的记录,但继续插入那些可以插入的记录

例如

create table table1
(value1 int,
value2 int,
constraint uc_tab1 Unique (value1,value2)
)

create table table2
(value1 int,
value2 int
)

insert into table2 (value1,value2)
select 1,1
union all 
select 2,1
union all
select 3,1
union all
select 1,1

insert into table1
select value1,value2 from table2
目前,这将取决于违反约束。我想抑制该错误,以便表1包含

1,1

2,1

3,1
(在本例中,我可以在表2中进行分组,但在我的实际应用程序中,这并不是真正可行的)

我模模糊糊地记得几年前读过一些关于这方面的东西,但我可能已经想象到了。这可能吗


非常感谢您不要这样做,您将很容易丢失数据


相反,尝试更改应用程序,使其只插入有效数据,而不删除不正确的数据

查看
MERGE
语句。这很复杂,但可以按照你所描述的去做


(即使某些行无法插入,也可能导致
INSERT
语句继续插入数据,但就我的一生而言,我无法在BOL中找到它,也无法回忆起它的名称。我敢肯定,无论如何,它都会引发错误,对我来说,这听起来总是一个可怕的想法。)

您可以使用
忽略重复键
,尽管我个人认为最好找到另一种解决问题的方法


您可以将其设置为
ON
,以便仅为违反唯一约束的插入行生成警告,而不是生成错误。

在创建约束时指定Ignore\u Dup\u Key就成功了。在上面的示例中,我将table1定义更改为

创建表1 (值1 int, 值2 int, 约束uc_tab1唯一(值1,值2)(忽略重复键=打开) )


在这种情况下,它工作得非常好,我们不会,因为它已经在那里了。我们只需要一个例子。我可以将insert表连接到原始表以查找重复的表,但我们的表太大了,我认为这将非常缓慢,这正是我所想的。@Bakhesh您可以通过检查我答案旁边的复选标记来感谢我:)已经这样做了。对不起,我的礼节有点生疏了