【问题标题】:IF NOT EXISTS - Mariadb Syntax如果不存在 - Mariadb 语法
【发布时间】:2018-01-23 04:21:16
【问题描述】:

我尝试插入新行或更新现有行(如果已包含)。

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

【问题讨论】:

    标签: sql mariadb exists


    【解决方案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 DUPLICATE KEY UPDATE value = VALUES(value);
    

    (注意使用VALUES(),这样您就不必重复输入。)

    为此,您需要在您关心的键上创建一个唯一索引:

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

    重复键不必是主键索引。
    它可以是任何唯一索引。

    【讨论】:

      【解决方案2】:

      你可以使用:

      -- 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;
      

      【讨论】:

      • 我尝试了“重复键更新”,但不幸的是它只与作为股票代码的主键有关,我不知道如何将它与基于所有 4 列的索引相关联。
      • 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 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');
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2020-03-10
      • 2016-01-05
      • 2015-10-26
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多