2017-08-15 16 views
1

我試圖插入一個新行或更新一個已存在的行。如果不存在 - Mariadb語法

我想我可以試試它的指數,但說實話我不知道如何做到這一點,因此我試圖用IF語句來做到這一點。 不幸的是這不工作或者是因爲它說我有我的語法有問題。我正在使用MariaDB。

IF NOT EXISTS (SELECT * FROM valuation 
       WHERE ticker = 'BK001EUR' AND depot_id =1 
       AND src_id =2 AND valuation_date ='2009-09-09') 
INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value) 
VALUES ('BK001EUR',1,2,'2009-09-09',14999260.46) 
ELSE 
UPDATE valuation 
SET value =14999260.46 
WHERE ticker = 'BK001EUR' AND depot_id =1 
    AND src_id =2 AND valuation_date ='2009-09-09'); 

回答

0

你可以使用:

-- if exists then it will update 
UPDATE valuation 
SET value =14999260.46 
WHERE ticker = 'BK001EUR' 
    AND depot_id =1 AND src_id =2 AND valuation_date ='2009-09-09'; 

-- if not exist then insert 
INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value) 
SELECT 'BK001EUR',1,2,'2009-09-09',14999260.46 
WHERE NOT EXISTS (SELECT 1 
        FROM valuation 
        WHERE ticker = 'BK001EUR' 
        AND depot_id =1 
        AND src_id =2 AND valuation_date ='2009-09-09'); 

或者更好的辦法INSERT ON DUPLICATE UPDATE

INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value) 
VALUES ('BK001EUR',1,2,'2009-09-09',14999260.46) 
ON DUPLICATE KEY UPDATE value =14999260.46; 
+0

我試過「關於重複密鑰更新」,但不幸的是它只涉及到主鍵是股票代碼,我不知道如何將它與基於所有4列的索引相關聯。 –

+0

'UPDATE valuation SET value = 14999260.46 WHERE ticker ='BK001EUR'AND src_id = 2 AND depot_id = 1 AND valuation_date ='2009-09-09'); INSERT INTO估值(ticker,depot_id,src_id,valuation_date,value)SELECT'BK001EUR',1,2,'2009-09-09',14999260.46 WHERE NOT EXISTS(SELECT 1 FROM valuation WHERE ticker ='BK001EUR'AND depot_id = 1 AND src_id = 2 AND valuation_date ='2009-09-09'); ' –

1

正確的方式做到這一點是使用insert . . . on duplicate key update。我會寫查詢爲:

INSERT INTO valuation (ticker, depot_id, src_id, valuation_date, value) 
    VALUES ('BK001EUR', 1, 2, '2009-09-09', 14999260.46) 
    ON DUCPLICATE KEY UPDATE value = VALUES(value); 

(注意用VALUES(),這樣你就不必再重複輸入。)

對於這個工作,你需要在一個唯一指數您關心的密鑰:

create unique index unq_valuation_4 on valuation(ticker, depot_id, src_id, valuation_date); 

重複密鑰干擾snot需要是主鍵索引。它可以是任何獨特的索引。