2014-10-28 42 views
1

我想知道如何在插入前檢查表中的數據。插入值時在sql中檢查數據

例如:當我插入時我想檢查eventstart值是否在同一個表中StartDateRoom如果是這樣則輸出錯誤消息,否則插入值。

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

爲什麼不首先做一個'SELECT'?也許有一個'COUNT',所以你不會不必要地帶回一堆記錄。 – 2014-10-28 16:44:17

+1

在插入前如何使用'If Exists(...)'? – 2014-10-28 16:53:54

回答

3

我只是使用這樣的查詢。如果計數不爲0,則至少有一個重複。

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

我會盡量把這個項目的背景下(假設你使用的SqlCommand,等等),但不包括在你的問題的任何代碼。


如果你問如何在同一時間重複檢查你想插入記錄(即將進行之前,而不是在一個單獨的查詢),那麼我不知道。如果有辦法我不會感到驚訝,我只是不知道。

+1

嘿。關於「在嘗試插入記錄的同時檢查重複項目」,我只是編輯了我的回答。根據你如何解釋「同時」,一個獨特的索引或約束在技術上做到這一點。它只是不能以可配置的方式報告;它只是錯誤。 – 2014-10-28 17:14:42

+1

@srutzky你的回答絕對看起來更有效率,而且我認爲,更符合OP的想法(至少我解釋他的問題標題的方式)。如果他得到它的工作,並讓我們知道,我會刪除這個答案。 – 2014-10-28 17:17:00

+0

沒問題。我只是試圖讓你知道,在插入的同時,確實存在一種檢查手段,在單獨的操作之外:)。 – 2014-10-28 17:19:02

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; 

上面可以在存儲過程中或經由SqlCommand C#中的參數化查詢(或一些其它語言)來完成。

OR

取決於你如何想陷阱的條件,它是可能通過一個唯一約束處理這個,然後它會檢查在被插入,而不需要額外的代碼(即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); 

更好YET

一舉兩得。 UNIQUE INDEX(現在不是約束,這是原因)不僅會強制執行規則,還會幫助加快查詢的速度。這將允許您輕鬆管理「錯誤」狀態和消息(而不是陷入SqlException並檢查ErrorCode)。

+1

不錯的一點,關於一旦找到匹配EXISTS停止。我想到可能有辦法一次完成這個,只是不確定那是什麼。 – 2014-10-28 17:03:07