如果在 mariadb 中不存在 SQL 插入

Posted

技术标签:

【中文标题】如果在 mariadb 中不存在 SQL 插入【英文标题】:SQL insert into if not exists in mariadb 【发布时间】:2021-12-29 21:30:33 【问题描述】:

如果该日期已经存在条目,我想在 SQL (mariadb) 中增加一个值。否则,应插入一个带有新日期的新条目。

我尝试了一些方法,但不断收到语法错误。我对 SQL 一无所知。

目标是实现能量计数器。该命令应通过 nodered 发送。

If Not Exists(select * from GAS_daily where date='2021-12-28 00:00:00')
    INSERT INTO GAS_daily(date,value) VALUES('2021-12-28 00:00:00', 1)
ELSE
    update GAS_daily set value=value+1, date=date WHERE date='2021-12-28 00:00:00'

【问题讨论】:

这能回答你的问题吗? How can I do 'insert if not exists' in mysql? 【参考方案1】:

我现在自己找到了方法。我不知道为什么 IF 查询不起作用。我已经用 DUPLCATE KEY 解决了这个问题。为此,我不得不改变桌子。我现在使用时间戳作为主键。

    CREATE TABLE gas_daily (
        ts TIMESTAMP NOT NULL,
        value DECIMAL(10,3) NOT NULL,
        PRIMARY KEY(ts)
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;

添加一些假值

    INSERT INTO gas_daily (ts,value) VALUES ('"2021-12-28 00:00:00"',123.0);
    INSERT INTO gas_daily (ts,value) VALUES ('"2021-12-29 00:00:00"',456.0);

    ts                 |value  |
    -------------------+-------+
    2021-12-28 00:00:00|123.000|
    2021-12-29 00:00:00|456.000|

测试 1 - 增加现有条目

    INSERT INTO gas_daily (ts, value)
    VALUES ("2021-12-29 00:00:00", "3")
    ON DUPLICATE KEY UPDATE
       ts = ts, 
       value = value+3
    ;

    ts                 |value  |
    -------------------+-------+
    2021-12-28 00:00:00|123.000|
    2021-12-29 00:00:00|459.000|

测试 2 - 生成一个新值

    INSERT INTO gas_daily (ts, value)
    VALUES ("2021-12-30 00:00:00", "3")
    ON DUPLICATE KEY UPDATE
       ts = ts, 
       value = value+3
    ;

    ts                 |value  |
    -------------------+-------+
    2021-12-28 00:00:00|123.000|
    2021-12-29 00:00:00|459.000|
    2021-12-30 00:00:00|  3.000|

javascript 中为特定的测量间隔创建唯一的时间戳。

    function createSQLCmd(TblName, interval, value)
        ts = new Date(Date.now())
        switch(interval)
            case "Min":
                ts.setSeconds(0);
                TblName=TblName+"_perMinute";
                break;
            case "Min10":
                ts.setSeconds(0);
                ts.setMinutes(ts.getMinutes()-ts.getMinutes()%10);
                TblName=TblName+"_per10Minutes";
                break;
            case "Hour":
                ts.setSeconds(0);
                ts.setMinutes(0);
                TblName=TblName+"_hourly";
                break;
            case "Day":
                ts.setSeconds(0);
                ts.setMinutes(0);
                ts.setUTCHours(0);
                TblName=TblName+"_daily";
                break;
            case "Week":
                ts.setSeconds(0);
                ts.setMinutes(0);
                ts.setUTCHours(0);
                ts.setDate(ts.getDate() - ts.getDay());
                TblName=TblName+"_weekly";
                break;
            case "Month":
                ts.setSeconds(0);
                ts.setMinutes(0);
                ts.setUTCHours(0);
                ts.setDate(1);
                TblName=TblName+"_monthly"; 
                break;
            case "Year":
                ts.setSeconds(0);
                ts.setMinutes(0);
                ts.setUTCHours(0);
                ts.setDate(1);
                ts.setMonth(1);
                TblName=TblName+"_yearly";
                break;
        
        let sqlTS=ts.toISOString().slice(0, 19).replace('T', ' ');
        return "INSERT INTO "+TblName+" (ts, value) VALUES ('"+sqlTS+"','"+value+"') ON DUPLICATE KEY UPDATE ts = ts, value = value+'"+value+"';"
    
    
    
    
    console.log(createSQLCmd("GAS","Day",3.4));
    // INSERT INTO gas_daily (ts, value) VALUES ('2021-12-31 00:00:00','3.4') ON DUPLICATE KEY UPDATE ts = ts, value = value+'3.4';

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如果在 mariadb 中不存在 SQL 插入的主要内容,如果未能解决你的问题,请参考以下文章

如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?

如果在过程中不存在 Oracle 插入

MariaDB 崩溃:引擎中不存在表 && 无法恢复表

SQL 查询存在且不存在

如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?

外键对数据插入的影响