sql server,复合密钥-忽略重复密钥

sql server,复合密钥-忽略重复密钥,sql,sql-server,composite-key,Sql,Sql Server,Composite Key,当我试图保存一条已经存在的记录时,有没有办法防止sql抛出错误。我有一个多对多关系的复合键表,它只有两个值,当我从应用程序更新模型时,它会尝试保存所有记录,已经存在的记录会抛出一个错误无法插入重复键有没有办法让数据库忽略这些值,或者我必须在应用程序中处理它吗?您正在调用一个INSERT并尝试添加重复的密钥。这个错误是故意的,而且是必要的。DB正在为异常和错误条件引发异常 相反,如果要执行“upsert”,则可能需要使用存储过程或语法 相反,如果您不想更新,而只想忽略表中已有的行,则只需向插入语句

当我试图保存一条已经存在的记录时,有没有办法防止sql抛出错误。我有一个多对多关系的复合键表,它只有两个值,当我从应用程序更新模型时,它会尝试保存所有记录,已经存在的记录会抛出一个错误
无法插入重复键
有没有办法让数据库忽略这些值,或者我必须在应用程序中处理它吗?

您正在调用一个
INSERT
并尝试添加重复的密钥。这个错误是故意的,而且是必要的。DB正在为异常和错误条件引发异常

相反,如果要执行“upsert”,则可能需要使用存储过程或语法

相反,如果您不想
更新
,而只想忽略表中已有的行,则只需向
插入
语句中添加一个异常。。。比如

....
WHERE 
    table.Key <> interting.key
。。。。
哪里
表.Key interting.Key

您正在调用一个
INSERT
并试图添加重复的密钥。这个错误是故意的,而且是必要的。DB正在为异常和错误条件引发异常

相反,如果要执行“upsert”,则可能需要使用存储过程或语法

相反,如果您不想
更新
,而只想忽略表中已有的行,则只需向
插入
语句中添加一个异常。。。比如

....
WHERE 
    table.Key <> interting.key
。。。。
哪里
表.Key interting.Key

在insert语句中尝试类似的操作

insert into foo (x,y)
select @x,@y
except
select x,y from foo

这将向foo添加一条记录,前提是该记录不在表中。

在insert语句中尝试类似的操作

insert into foo (x,y)
select @x,@y
except
select x,y from foo

只有当记录不在表中时,才会将其添加到foo中。

您可以尝试使用该选项创建索引,以便只有当您有重复的键而不是真正的错误时,才会收到警告

另一个选项(可能更好)是使用语句而不是insert。MERGE语句让您可以在一个语句中插入、更新和删除所有内容,听起来它应该适合您正在尝试的操作


最后但并非最不重要的一点,正如您所说的,在应用程序中修复它,只插入需要添加的行。

您可以尝试使用该选项创建索引,这样,只有当您有重复的键而不是真正的错误时,才会收到警告

另一个选项(可能更好)是使用语句而不是insert。MERGE语句让您可以在一个语句中插入、更新和删除所有内容,听起来它应该适合您正在尝试的操作

最后但并非最不重要的一点是,正如您所说,在应用程序中修复它,只插入需要添加的行