插入值时正在检查sql中的数据

本文关键字:sql 数据 检查 插入 | 更新日期: 2023-09-27 18:28:05

我想知道在插入之前如何检查表中的数据。

例如:当我插入时,我想检查eventstart值是否在具有相同StartDate和相同Room的表中。如果是,则输出错误消息,否则插入该值。

insert into events([Text], [eventStart], [EventEnd], [Repeat], [Days], [Room], [StartDate]) 
values(Text, EventStart, EventEnd, , Days, Room, StartDate)

插入值时正在检查sql中的数据

我只想使用这样的查询。如果计数不为0,则至少有一个重复。

SELECT COUNT(*) 
FROM events
WHERE StartDate = @StartDate
  AND Room = @Room
  AND EventStart = @EventStart

我本想把它放在你的项目上下文中(假设你使用的是SqlCommand等),但你的问题中没有包含任何代码。


如果您在尝试插入记录的同时(而不是在之前的单独查询中)询问如何检查重复项,那么我不确定。如果有办法的话,我不会感到惊讶,我只是不知道。

由于这里唯一相关的选项是"行不在"answers"行已经在",因此不需要COUNT。IF EXISTS效率更高,因为它将在找到一行时停止执行,而不是扫描整个表(或索引)却找不到更多的条目,因为无论如何只有1个条目。

因此:

IF (EXISTS(
     SELECT *
     FROM   Events
     WHERE  [eventstart] = @EventStart
     AND    [StartDate] = @StartDate
     AND    [Room] = @Room
   ))
BEGIN
   RAISERROR('Row already exits!', 16, 1);
   RETURN;
END;
ELSE
BEGIN
   INSERT INTO Events
          ([Text], [eventStart], [EventEnd], [Repeat], [Days], [Room], [StartDate])
   VALUES (@Text, @EventStart, @EventEnd, @Repeat, @Days, @Room, @StartDate);
END;

上述操作既可以在存储过程中完成,也可以通过C#(或某些其他语言)中的SqlCommand作为参数化查询完成。

根据您想要捕获条件的方式,可以通过UNIQUE CONSTRAINT处理此问题,然后在插入时进行检查,而不需要额外的代码(即IF EXISTS SELECT构造)。这里的优点是a)代码更少,b)规则总是被强制执行,而不仅仅是在这个例子中。缺点是a)"规则"有点隐藏,可能会被遗忘,直到有人愚蠢地编写不尊重规则的代码,b)它中止了INSERT的事务,如果可能的话,我会尽量避免。最后,如果这是一条严格的系统规则,那么最好通过UNIQUE CONSTRAINT来执行,这样可以确保没有人可以绕过该规则。

CREATE UNIQUE NONCLUSTERED INDEX [UIX_Events_fields]
   ON dbo.[Events] ([EventStart] ASC, [Room] ASC, [StartDate] ASC);

更好

两者都做。UNIQUE INDEX(现在不是CONSTRAINT,原因如下)不仅可以强制执行规则,还可以帮助加快IF EXISTS SELECT查询的速度。这将允许您轻松管理"错误"条件和消息(而不是捕获SqlException并检查ErrorCode)。