簡體   English   中英

如果存在行則執行更新,否則執行insert

[英]Execute update if row exists else do insert

我必須將多個行更新到表中,如果表中不存在更新行,則需要插入該行。 我不能使用唯一鍵,因此不能使用ON復制KEY UPDATE

我必須實現這樣的目標

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

這是一個高性能的應用程序。任何想法? 代碼級別或查詢級別

僅供參考:數據庫是Mysql

您可以使用臨時表。

  1. 將您的數據放入臨時表中
  2. 通過JOIN更新“其他”表
  3. 從臨時表中刪除匹配的數據
  4. 將臨時表中的剩余內容插入主表。

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

這就是我們使用的商店程序,也可能適合您。

if not exists (select 1 from Table  where column1  ='xxxxx' AND   column2='xxxxx')
        insert into Table ( column1,column2)
        values ( @xxxx,xxxxx)
else 
    update Table
UPDATE <TABLE>
SET COLUMN1 = 'xxxx', COLUMN2 ...
WHERE COLUMN1 = ... AND COLUMN2 ...

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

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

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並不好。

你可以使用EXISTS或檢查sub select的cound,如果它> 0,知道該行是否已經存在

您可能會發現有用的REPLACE語句。 它的語法在這里描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM