2009-10-28 69 views
2

我正在構建一個計數器。我有一個文章目錄並跟蹤獨特的訪問者。當訪問者來到我插入文章ID和他們的IP地址在數據庫中。首先我檢查是否存在文章ID,如果IP不存在,我做插入。這是兩個查詢 - 有沒有辦法讓這個一個查詢僅當行不存在時插入一行

另外,我不使用存儲過程,我經常使用內聯SQL

+0

這種行爲有時被稱爲 '的Upsert'。例如更新或插入。 – 2009-10-28 02:46:00

+1

@羅伯特:我沒有看到盧克正在做任何更新。它只是插入,或不。 – 2009-10-28 02:51:24

+0

我認爲他們正在跟蹤上次訪問。我的錯。無論如何,IP地址不適合跟蹤唯一訪問 - 例如, NAT和DHCP – 2009-10-28 03:00:16

回答

2

是的,您可以創建一個唯一約束列ARTICLE_ID和IP_ADDRESS 。當您嘗試插入重複項時,INSERT將被拒絕並顯示錯誤。剛剛回答了SQLite的相同問題here

0

我能想到的唯一方法是使用SqlCommand對象執行動態SQL。

IF EXISTS(SELECT 1 FROM IPTable where IpAddr=<ipaddr>) 
--Insert Statement 
0

我與拉里同意關於使用獨特性,但我會實現它是這樣的:

  • IP_ADDRESS,PK
  • ARTICLE_ID,PK,FK

這確保了記錄是獨一無二的。嘗試插入重複項會從數據庫中獲取錯誤。

0

我真的會用程序! :)

但無論哪種方式,這可能會工作:

創建IP和文章ID列的唯一索引,如果它們已經存在插入查詢會失敗,所以在技術上它會工作! (MySQL的測試)

+0

猜測我被拉里擊敗了:) – 2009-10-28 02:36:21

3

這裏有一些選擇:

INSERT IGNORE INTO `yourTable` 
    SET `yourField` = 'yourValue', 
    `yourOtherField` = 'yourOtherValue'; 

從MySQL參考手冊:「如果使用IGNORE關鍵詞,在執行INSERT語句都被視爲警告而不是例如發生的錯誤。 ,如果沒有IGNORE,那麼複製表中現有的UNIQUE索引或PRIMARY KEY值的行將導致重複鍵錯誤,並且語句會中止。「。)如果記錄尚不存在,它將被創建。

另一種選擇是:

INSERT INTO yourTable (yourfield,yourOtherField) VALUES ('yourValue','yourOtherValue') 
ON DUPLICATE KEY UPDATE yourField = yourField; 

不會引發錯誤或警告。

+3

這很酷,但用戶使用SQL Server 2005,按照他的標籤。 – 2009-10-28 02:45:19

+0

它看起來像這個答案發布後添加了sql server標記。 – 2009-10-28 03:03:00

+0

@羅伯特:這不會阻止其他人下臺。 – 2009-10-28 03:09:52

1

不適用於SQL Server。使用T-SQL,您必須檢查是否存在行,然後根據需要使用INSERT或UPDATE。

另一種方法是首先嚐試更新,然後檢查行數以查看是否有更新的記錄。如果不是,則INSERT。考慮到50/50的機會,你在50%的時間內執行了單個查詢。

MySQL有一個名爲REPLACE的擴展,它具有您尋求的功能。

0

試試這個(這是一個真正的kludge,但它應該工作...):

Insert TableName ([column list]) 
Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted 
From TableName 
Where Not Exists 
    (Select * From TableName 
    Where PK == @PK) 
2
IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...) 
    INSERT... 
相關問題