11

我有一张名为:

Delegates

该表有四个字段:

ID(Auto increment, Primary)
MemberNo, FromYr, ToYr

我用这个查询插入:

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)

这些值来自用户输入。一个成员可以成为任何一年的代表,这就是为什么我允许他们随意输入的原因。但现在的问题是他们可以将同一年的一个成员错误插入超过 2 次。请帮帮我,我现在可以在这里做什么?

4

6 回答 6

19

使用合并

MERGE INTO Delegates D
USING (values(@MemNo, @FromYr,@ToYr)) X ([MemNo],[FromYr],[ToYr])
ON (insert unique key join)
WHEN NOT MATCHED BY TARGET THEN
INSERT ([MemNo],[FromYr],[ToYr]))
VALUES (X.[MemNo],X.[FromYr],X.[ToYr]);
于 2013-07-03T08:15:30.587 回答
7

在插入之前检查是否存在具有相同值的记录:

if not exists (select * from Delegates d where d.FromYr = @FromYr and d.MemNo = @MemNo)
    INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
于 2013-07-03T08:16:00.953 回答
2

试试这个,(我还没有验证)

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
where @MemNo not in 
(
    SELECT MemNo FROM words WHERE FromYr = @FromYr
)
于 2013-07-03T08:19:32.810 回答
2

只需在该列上添加唯一索引,然后插入重复项将导致错误。然后,如果它需要优雅地失败,您可以错误处理它

于 2018-02-21T15:39:27.983 回答
1

创建一个存储过程,首先检查值是否已包含在数据库中。如果他们不是,你会做你的插入。如果他们只是忽略它

于 2013-07-03T08:16:19.360 回答
0

您可以使用以下简单的一行代码来避免插入重复项:

INSERT INTO Delegates (MemNo, FromYr, ToYr) SELECT @MemNo, @FromYr, @ToYr WHERE NOT EXISTS (SELECT 1 FROM Delegates d WHERE d.MemNo=@MemNo AND d.FromYr=@FromYr)

如果这是一个高负载环境,在该命令执行时另一个命令可能会插入重复项,则可以使用WITH(HOLDLOCK)提示。

于 2015-10-05T03:26:40.923 回答