2012-03-09 125 views
1

我試圖找到一個查詢,它只是插入值,但不應該這樣做,如果值存在。現在我看到了很多例子,但它們都依靠主鍵或表格來移動表格。我只是想在表中添加一個新行,並假設其中一個列沒有相同的值添加它。我知道以下幾點不會奏效,但它和我想的一樣接近,如果我的寫作不夠,可能會清除它。插入到不是主鍵的忽略重複項

INSERT INTO table (txtLastName,txtEmail,txtZip) 
    Values ('Tester','[email protected]','12345') 
    WHERE txtLastName <> 'Tester' 
    or WHERE txtEmail <> '[email protected]' 
    or WHERE txtZip <> '12345' 

使用MS SQL Server。

+0

我沒有試圖讓3個主鍵。如果這三列中的一列已經具有該值,我只是不希望它被插入。 – alsu3 2012-03-09 17:20:39

+1

請讓我們知道您正在使用的關係數據庫 – 2012-03-09 17:21:10

回答

4

您應該創建由三個字段(txtLastName,txtEmail,txtZip)組成的Unique Constraint

鏈接指向SQL Server文檔,但唯一約束的概念是RDBMS通用。

只要注意,當你創建一個唯一約束時,你的重複插入不會僅僅失敗失敗:它會拋出一個錯誤,說插入試圖違反唯一約束。當然,它應該這樣做!確保你的代碼處理這個異常。

+0

會有這樣的事情幫助一個已經制作好的表嗎? – alsu3 2012-03-09 17:23:09

+0

是的,會的。但是,您應該在創建約束之前搜索重複項。除非刪除重複項,否則一些RDBMS不會讓您創建它。什麼是RDBMS呢? – 2012-03-09 17:24:53

+0

看看這個鏈接如何幫助停止插入。 INSERT INTO tbl(txtLastName,txtEmail,txtZip) WHERE unique Values('Tester','[email protected]','12345') – alsu3 2012-03-09 17:42:29

1

試試這個:

INSERT INTO table (txtLastName,txtEmail,txtZip) 
SELECT 'Tester','[email protected]','12345' 
WHERE NOT EXISTS (SELECT * 
        FROM table 
        WHERE txtLastName = 'Tester' 
        AND txtEmail = '[email protected]' 
        AND txtZip = '12345' 
) 
+0

剛剛添加了11次值。 – alsu3 2012-03-09 17:43:23

+1

這是一個很好的查詢,但您確實需要唯一的約束來防止某人更改數據或使用不同的代碼進行插入。 – HLGEM 2012-03-09 19:02:56

+0

@ alsu3:表中有11行開頭嗎?意思是,你現在有22?我現在看到我的查詢會插入ASWOW ROWS,因爲已經有了!哎呀!固定... – n8wrl 2012-03-09 21:51:56