2017-08-15 18 views
1

私は新しい行を挿入しようとしましたが、既に含まれている場合は新しい行を更新しようとしました。IF NOT EXISTS - Mariadb Syntax

私はインデックスで試すことができたと思ったが、正直言って私はこれを行う方法がわからないので、私は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評価SET値= 14999260.46ティッカー= 'BK001EUR'、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は存在しない(WHERE ticker = 'BK001EUR' AND 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); 

重複するキーは、主キーインデックスである必要があります。一意のインデックスでもかまいません。

関連する問題