插入值时正在检查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)
我只想使用这样的查询。如果计数不为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)。