Sql 如果不存在-Mariadb语法

Sql 如果不存在-Mariadb语法,sql,mariadb,exists,Sql,Mariadb,Exists,我试图插入一个新行,或者更新一个已经包含的现有行 我想我可以尝试使用索引,但老实说,我不知道如何做到这一点,因此我尝试使用IF语句。 不幸的是,这也不起作用,因为它说我的语法有问题。我正在使用MariaDB IF NOT EXISTS (SELECT * FROM valuation WHERE ticker = 'BK001EUR' AND depot_id =1 AND src_id =2 AND valuation_dat

我试图插入一个新行,或者更新一个已经包含的现有行

我想我可以尝试使用索引,但老实说,我不知道如何做到这一点,因此我尝试使用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');
您可以使用:

-- 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 INTO valuation (ticker, depot_id, src_id, valuation_date, value) 
  VALUES ('BK001EUR', 1, 2, '2009-09-09', 14999260.46) 
  ON DUPLICATE KEY UPDATE value = VALUES(value);
注意使用值,这样就不必重复输入

要使其正常工作,您需要在所关心的键上创建一个唯一索引:

create unique index unq_valuation_4 on valuation(ticker, depot_id, src_id, valuation_date);
重复键不需要是主键索引。
它可以是任何唯一的索引。

我尝试了重复键更新,但不幸的是,它只与主键相关,主键是ticker,我不知道如何将它与基于所有4列的索引相关联。更新估值集值=14999260.46,其中ticker='BK001EUR'和src_id=2,depot_id=1和估值_date='2009-09-09';插入估价单,仓库id,src id,估价单日期,价值选择'BK001EUR',1,2,'2009-09-09',14999260.46如果不存在,从估价单中选择1,其中,股票代码为'BK001EUR',仓库id=1,src id=2,估价单日期为'2009-09-09';
create unique index unq_valuation_4 on valuation(ticker, depot_id, src_id, valuation_date);