sql - 在 SQL Server 中插入时忽略重复键

标签 sql sql-server

我有一个名为 CustomerMemo 的表:

客户备忘录

CustomerID
MemoID

这两个都是外键。这些列不是唯一的,因为可能是这样的:

CustomerID    MemoID
-----------   -------
1             1
1             2
1             3

但是,我想避免的是这样的事情:

CustomerID    MemoID
-----------   -------
1             1
1             1

有人知道如何在 SQL Server 中执行此操作吗?

最佳答案

如果您真的想在插入时忽略重复键,那么您需要在索引或唯一约束定义中使用 IGNORE_DUP_KEY 索引选项。

这是 MSDN 上的文档:

CREATE INDEX (Transact-SQL)

该文章中的示例(在 D 部分。使用 IGNORE_DUP_KEY 选项):

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
    WITH (IGNORE_DUP_KEY = ON);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO

对于您的表,这将是命令:

CREATE UNIQUE INDEX UNQ_CustomerMemo ON CustomerMemo (MemoID, CustomerID)
    WITH (IGNORE_DUP_KEY = ON);

使用 IGNORE_DUP_KEY 的缺点是您无法看到哪些数据违反了唯一约束。一般来说,最好在插入之前确保数据是唯一的,然后当你确实有一些东西从裂缝中掉下来时,你会得到错误,以及违反唯一约束的值。这将使插入语句的故障排除更加容易。也就是说,我在定义表变量时自由使用了这个选项,因为范围是有限的。

至于是否应该使用唯一键或唯一索引,请参见以下关于堆栈溢出的问题: Unique key vs. unique index on SQL Server 2008

关于sql - 在 SQL Server 中插入时忽略重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29516637/

相关文章:

sql - SQL扫描数据库中的先前记录

sql - 需要有关 SQL 查询的帮助

sql - 这个 PL/SQL 触发器有什么问题?

mysql - 自连接 SQL 查询

sql - 数据库的请求限制为30,已达到: which statuses of request count for this error?

sql-server - SQL 服务器 : why are sizes of different backups the same?

python - 您可以将表输入参数从 Python 传递给 SQL Server 吗?

sql - 为什么系统存储过程在包含所有者的情况下会失败?

mysql - 如何进行查询以在两列中添加值

sql - Activerecord 将具有相同列值的行合并为一个