如何在sqlite3中组合insert语句和update语句?

时间:2017-09-22 07:06:33

标签: sqlite

我有一个表(try),有一个主键(pk),几个数据字段(dx,dy,dz)和一个时间字段(td)。在sqlite3中,我想:

  1. 如果(pk)不存在,请插入记录(pk,dx,dy,dz)。
  2. 如果记录存在,请更新它。
  3. 在更新期间,如果某些字段(dx,dy)有任何更改,请将td更新为当前时间。
  4. 在更新期间,如果上述字段(dx,dy)没有变化,请按原样保留td(原始时间)。
  5. REPLACE接近我需要的东西,但是它会插入"插入"或者"替换所有",而我需要"插入"或者"更新一些"。

    这是有效的,但这需要2个陈述 一个用于检查记录是否先存在,然后再进行插入或更新。如何在一个声明中执行这些?

    -- Example table
    CREATE TABLE try(
        pk INTEGER  PRIMARY KEY,
        dx TEXT NOT NULL,   -- update td if this changes.
        dy TEXT,            -- update td if this changes.
        dz TEXT,            -- no need to change td, if this changes.
        td DATETIME DEFAULT (strftime('%s','now'))
    );
    
    -- 1. Check if record exists or not.
    SELECT pk from try where pk=1;
    
    -- 2.a If record does not exist, do this insert.
    INSERT INTO try(pk, dx, dy, td) VALUES(1, 'data_x', 'data_y', 'data_z', strftime('%s', 'now'));
    
    -- 2.b If record exists, update but be selective with td.
    UPDATE try SET dx='data_x',
                   dy='data_y_new',
                   dz='data_z_new',
                   td=(CASE WHEN (try.dx IS NOT 'data_x' OR try.dy IS NOT 'data_y_new') THEN strftime('%s','now')
                            ELSE try.td
                       END)
               WHERE pk=1;
    

1 个答案:

答案 0 :(得分:0)

我能够将这些陈述合并到我的要求中,这里仅供参考,供以后可能需要它的人使用。但是,请注意,在事务中使用多个语句(如CL所建议的)通常可能更简单。

REPLACE INTO try VALUES(1,
                        'data_x',
                        'data_y_new',
                        'data_z_new',
                        CASE WHEN EXISTS(SELECT td FROM try AS try2 WHERE (try2.pk IS 1 AND try2.dx IS 'data_x' AND try2.dy IS 'data_y_new'))
                             THEN (SELECT td FROM try AS try3 WHERE (try3.pk IS 1))
                             ELSE strftime('%s','now')
                             END);
相关问题