我正在構建一個計數器。我有一個文章目錄並跟蹤獨特的訪問者。當訪問者來到我插入文章ID和他們的IP地址在數據庫中。首先我檢查是否存在文章ID,如果IP不存在,我做插入。這是兩個查詢 - 有沒有辦法讓這個一個查詢僅當行不存在時插入一行
另外,我不使用存儲過程,我經常使用內聯SQL
我正在構建一個計數器。我有一個文章目錄並跟蹤獨特的訪問者。當訪問者來到我插入文章ID和他們的IP地址在數據庫中。首先我檢查是否存在文章ID,如果IP不存在,我做插入。這是兩個查詢 - 有沒有辦法讓這個一個查詢僅當行不存在時插入一行
另外,我不使用存儲過程,我經常使用內聯SQL
是的,您可以創建一個唯一約束列ARTICLE_ID和IP_ADDRESS 。當您嘗試插入重複項時,INSERT將被拒絕並顯示錯誤。剛剛回答了SQLite的相同問題here。
我能想到的唯一方法是使用SqlCommand
對象執行動態SQL。
IF EXISTS(SELECT 1 FROM IPTable where IpAddr=<ipaddr>)
--Insert Statement
我與拉里同意關於使用獨特性,但我會實現它是這樣的:
IP_ADDRESS
,PKARTICLE_ID
,PK,FK這確保了記錄是獨一無二的。嘗試插入重複項會從數據庫中獲取錯誤。
我真的會用程序! :)
但無論哪種方式,這可能會工作:
創建IP和文章ID列的唯一索引,如果它們已經存在插入查詢會失敗,所以在技術上它會工作! (MySQL的測試)
猜測我被拉里擊敗了:) – 2009-10-28 02:36:21
這裏有一些選擇:
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;
不會引發錯誤或警告。
這很酷,但用戶使用SQL Server 2005,按照他的標籤。 – 2009-10-28 02:45:19
它看起來像這個答案發布後添加了sql server標記。 – 2009-10-28 03:03:00
@羅伯特:這不會阻止其他人下臺。 – 2009-10-28 03:09:52
不適用於SQL Server。使用T-SQL,您必須檢查是否存在行,然後根據需要使用INSERT或UPDATE。
另一種方法是首先嚐試更新,然後檢查行數以查看是否有更新的記錄。如果不是,則INSERT。考慮到50/50的機會,你在50%的時間內執行了單個查詢。
MySQL有一個名爲REPLACE的擴展,它具有您尋求的功能。
試試這個(這是一個真正的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)
IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...)
INSERT...
這種行爲有時被稱爲 '的Upsert'。例如更新或插入。 – 2009-10-28 02:46:00
@羅伯特:我沒有看到盧克正在做任何更新。它只是插入,或不。 – 2009-10-28 02:51:24
我認爲他們正在跟蹤上次訪問。我的錯。無論如何,IP地址不適合跟蹤唯一訪問 - 例如, NAT和DHCP – 2009-10-28 03:00:16