2013-01-11 98 views
4

如果表中不存在更新行,我需要將該行的行數更新爲一個表。我不能用獨有的關鍵,因此與沒有使用上的重複密鑰更新如果行存在,則執行更新否則請插入

我一定要實現這樣的事情

DECLARE count DOUBLE; 
SELECT count(uid) 
INTO count 
FROM Table 
WHERE column1 ='xxxxx' 
AND column2='xxxxx'; 

IF (count=0) 
THEN 
    --peform insert 
ELSE 
    --perform update 
END IF 

這是一個高性能的application.Any想法?代碼級或查詢級

FYI:數據庫爲MySQL

回答

-1

您可能會發現有用的REPLACE語句。其語法描述here

+0

更換採用唯一性主鍵匹配現有記錄 –

0
UPDATE <TABLE> 
SET COLUMN1 = 'xxxx', COLUMN2 ... 
WHERE COLUMN1 = ... AND COLUMN2 ... 

IF @@ROWCOUNT = 0 
    INSERT INTO <TABLE> (COLUMN1, ...) 
    VALUES ('xxxx', ...) 

確保在TRANSACTION ISOLATION LEVEL REPEATABLE READ運行,如果併發可能是一個問題。

3

您可以使用臨時表。

  1. 把你的數據到臨時表
  2. 通過JOIN做了「等」表的更新
  3. 從臨時表中刪除匹配的數據
  4. 從臨時表中插入剩餘的東西進入主表。

如果您有大量數據,這將比按記錄進行記錄要快。

1

這是我們使用的存儲過程,可能也適合您。

if not exists (select 1 from Table where column1 ='xxxxx' AND column2='xxxxx') 
     insert into Table (column1,column2) 
     values (@xxxx,xxxxx) 
else 
    update Table 
+0

宕通過30秒打我: )你爲什麼不首先存在的任何原因?我認爲更新是一個更常見的情況。 – Destrictor

+0

:)要成爲我們沒有「其他」部分,我們要麼插入或不插入,所以回答你的問題:是的,如果是另一種方式,可能會更好:) –

0
BEGIN TRAN 
IF EXISTS (SELECT * 
     FROM Table WITH (UPDLOCK, SERIALIZABLE) 
     WHERE CONDITION) 
BEGIN 
    UPDATE Table SET SOMETHING WHERE CONDITION 
END 
ELSE 
BEGIN 
    INSERT INTO Table(Field1,....) VALUES (Value1,.....) 
END 
COMMIT TRAN 

注:交易是非常好的,但使用IF EXISTS不好與多張查詢插入/更新用的情況。

0

您可以使用EXISTS或檢查子的cound選擇如果> 0知道,如果該行媒體鏈接存在

相關問題