我想知道在插入之前如何检查表格中的数据。
例如:当我插入时,我想检查eventstart
值是否在表中,StartDate
和Room
是否相同,如果是,则输出错误消息,否则插入值。
insert into events([Text], [eventStart], [EventEnd], [Repeat], [Days], [Room], [StartDate])
values(Text, EventStart, EventEnd, , Days, Room, StartDate)
答案 0 :(得分:3)
我只是使用这样的查询。如果计数不为0,则至少有一个重复。
SELECT COUNT(*)
FROM events
WHERE StartDate = @StartDate
AND Room = @Room
AND EventStart = @EventStart
我本来试图把它放在你的项目的上下文中(假设你正在使用SqlCommand等),但你没有在你的问题中包含任何代码。
如果您在尝试插入记录的同时询问如何检查重复项(而不是在之前,在单独的查询中),那么我不确定。如果有办法,我不会感到惊讶,我只是不知道。
答案 1 :(得分:3)
由于这里唯一相关的选项是“行不存在”和“行已存在”,因此不需要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)。